# -*- coding: utf-8 -*-
import copy
import skin
from enigma import eListboxPythonMultiContent, gFont, getPrevAsciiCode, RT_HALIGN_CENTER, RT_VALIGN_CENTER, getDesktop
from Components.ActionMap import HelpableNumberActionMap, NumberActionMap
from Components.Input import Input
from Components.Label import Label
from Components.Language import language
from Components.MenuList import MenuList
from Components.MultiContent import MultiContentEntryText, MultiContentEntryPixmapAlphaBlend, MultiContentEntryPixmapAlphaTest
from Components.Sources.StaticText import StaticText
from Screens.ChoiceBox import ChoiceBox
from Screens.Screen import Screen
from Tools.LoadPixmap import LoadPixmap
from Components.Pixmap import Pixmap
from Tools.NumericalTextInput import NumericalTextInput
from Tools.Directories import resolveFilename, SCOPE_PLUGINS
from Components.config import config
from skin import loadSkin

loadSkin(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/vkskin.xml'))

import six
pyunichar = six.unichr
# In my tests on Ubuntu the "u" works for both python versions but according to six.pdf we can use "six.u" instead of "u"


class VirtualKeyBoardList(MenuList):

    def __init__(self, list, enableWrapAround=False):
        MenuList.__init__(self, list, enableWrapAround, eListboxPythonMultiContent)
        font = skin.fonts.get('VirtualKeyBoard', ('Regular', 28, 45))
        self.l.setFont(0, gFont(font[0], font[1]))
        self.l.setFont(1, gFont(font[0], font[1] * 5 / 9))
        self.l.setItemHeight(font[2])


class VirtualKeyBoard(Screen):

    def __init__(self, session, title='', text='', maxSize=False, visible_width=False, type='', currPos=0, allMarked=False):
        Screen.__init__(self, session)
        self.title = title
        self.text = text
        self.type = type
        self.maxSize = maxSize
        self.visible_width = visible_width
        self.currPos = currPos
        self.allMarked = allMarked
        self.initclass_new()

    def initclass_old(self):
        dwidth = getDesktop(0).size().width()
        if dwidth == 1280:
            self.skinName = 'vkeyboardold_hdskin'
        else:
            self.skinName = 'vkeyboardold_fhdskin'
        self.setTitle(_('Virtual keyboard'))
        self.keys_list = []
        self.shiftkeys_list = []
        self.thirdkeys_list = []
        self.lang = language.getLanguage()
        self.nextLang = None
        self.shiftMode = 0
        self.selectedKey = 0
        self.smsChar = None
        self.sms = NumericalTextInput(self.smsOK)
        if dwidth == 1280:
            self.key_bg = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsHD/vkey_bg.png'))
            self.key_sel = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsHD/vkey_sel.png'))
            self.key_backspace = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsHD/vkey_backspace.png'))
            self.key_all = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsHD/vkey_all.png'))
            self.key_clr = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsHD/vkey_clr.png'))
            self.key_esc = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsHD/vkey_esc.png'))
            self.key_ok = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsHD/vkey_ok.png'))
            self.key_shift = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsHD/vkey_shift.png'))
            self.key_shift_sel = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsHD/vkey_shift_sel.png'))
            self.key_space = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsHD/vkey_space.png'))
            self.key_left = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsHD/vkey_left.png'))
            self.key_right = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsHD/vkey_right.png'))
        else:
            self.key_bg = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsFHD/vkey_bg.png'))
            self.key_sel = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsFHD/vkey_sel.png'))
            self.key_backspace = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsFHD/vkey_backspace.png'))
            self.key_all = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsFHD/vkey_all.png'))
            self.key_clr = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsFHD/vkey_clr.png'))
            self.key_esc = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsFHD/vkey_esc.png'))
            self.key_ok = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsFHD/vkey_ok.png'))
            self.key_shift = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsFHD/vkey_shift.png'))
            self.key_shift_sel = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsFHD/vkey_shift_sel.png'))
            self.key_space = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsFHD/vkey_space.png'))
            self.key_left = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsFHD/vkey_left.png'))
            self.key_right = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsFHD/vkey_right.png'))
        self.keyImages = {'BACKSPACE': self.key_backspace,
         'ALL': self.key_all,
         'EXIT': self.key_esc,
         'OK': self.key_ok,
         'SHIFT': self.key_shift,
         'SPACE': self.key_space,
         'LEFT': self.key_left,
         'RIGHT': self.key_right}
        self.keyImagesShift = {'BACKSPACE': self.key_backspace,
         'CLEAR': self.key_clr,
         'EXIT': self.key_esc,
         'OK': self.key_ok,
         'SHIFT': self.key_shift_sel,
         'SPACE': self.key_space,
         'LEFT': self.key_left,
         'RIGHT': self.key_right}
        self.keyImagesThird = {'BACKSPACE': self.key_backspace,
         'ALL': self.key_all,
         'CLEAR': self.key_clr,
         'EXIT': self.key_esc,
         'OK': self.key_ok,
         'SHIFT': self.key_shift_sel,
         'SPACE': self.key_space,
         'LEFT': self.key_left,
         'RIGHT': self.key_right}
        self['key_red'] = StaticText(_('Exit'))
        self['key_green'] = StaticText(_('OK'))
        self['key_yellow'] = StaticText('')
        self['key_blue'] = StaticText(_('Upper / Lower'))
        self['country'] = StaticText('')
        self['header'] = Label(self.title)
        self['text'] = Input(text=self.text, maxSize=self.maxSize, visible_width=self.visible_width, type=self.type, currPos=len(self.text), allMarked=self.allMarked)
        self['list'] = VirtualKeyBoardList([])
        self['actions'] = NumberActionMap(['OkCancelActions',
         'WizardActions',
         'ColorActions',
         'KeyboardInputActions',
         'InputBoxActions',
         'InputAsciiActions'], {'gotAsciiCode': self.keyGotAscii_old,
         'ok': self.okClicked_old,
         'cancel': self.exit,
         'left': self.left_old,
         'right': self.right_old,
         'up': self.up_old,
         'down': self.down_old,
         'red': self.exit,
         'green': self.ok,
         'yellow': self.switchLang,
         'blue': self.shiftClicked_old,
         'deleteBackward': self.backClicked,
         'deleteForward': self.forwardClicked,
         'back': self.exit,
         'pageUp': self.cursorRight,
         'pageDown': self.cursorLeft,
         '1': self.keyNumberGlobal_old,
         '2': self.keyNumberGlobal_old,
         '3': self.keyNumberGlobal_old,
         '4': self.keyNumberGlobal_old,
         '5': self.keyNumberGlobal_old,
         '6': self.keyNumberGlobal_old,
         '7': self.keyNumberGlobal_old,
         '8': self.keyNumberGlobal_old,
         '9': self.keyNumberGlobal_old,
         '0': self.keyNumberGlobal_old}, -2)
        self.setLang()
        self.onExecBegin.append(self.setKeyboardModeAscii)
        self.onLayoutFinish.append(self.buildVirtualKeyBoard_old)
        self.onClose.append(self.__onClose)

    def __onClose(self):
        self.sms.timer.stop()

    def switchLang(self):
        self.lang = self.nextLang
        self.setLang()
        self.buildVirtualKeyBoard_old()

    def setLang(self):
        self.thirdkeys_list = []
        if self.lang == 'ar_AE':
            self.keys_list = [[u'EXIT',
              u'1',
              u'2',
              u'3',
              u'4',
              u'5',
              u'6',
              u'7',
              u'8',
              u'9',
              u'0',
              u'BACKSPACE'],
             [u'\u0636',
              u'\u0635',
              u'\u062b',
              u'\u0642',
              u'\u0641',
              u'\u063a',
              u'\u0639',
              u'\u0647',
              u'\u062e',
              u'\u062d',
              u'\u062c',
              u'\u062f'],
             [u'\u0634',
              u'\u0633',
              u'\u064a',
              u'\u0628',
              u'\u0644',
              u'\u0627',
              u'\u062a',
              u'\u0646',
              u'\u0645',
              u'\u0643',
              u'\u0637',
              u'#'],
             [u'\u0626',
              u'\u0621',
              u'\u0624',
              u'\u0631',
              u'\u0644\u0627',
              u'\u0649',
              u'\u0629',
              u'\u0648',
              u'\u0632',
              '\xd8\xb8',
              u'\u0630',
              u'CLEAR'],
             [u'SHIFT',
              u'SPACE',
              u'+',
              u'-',
              u'*',
              u'/',
              u'.',
              u',',
              u'@',
              u'%',
              u'&',
              u'OK']]
            self.shiftkeys_list = [[u'EXIT',
              u'!',
              u'"',
              u'\xa7',
              u'$',
              u'^',
              u'<',
              u'>',
              u'(',
              u')',
              u'=',
              u'BACKSPACE'],
             [u'\u064e',
              u'\u064b',
              u'\u064f',
              u'\u064c',
              u'\u0644\u0625',
              u'\u0625',
              u'\u2018',
              u'\xf7',
              u'\xd7',
              u'\u061b',
              u'<',
              u'>'],
             [u'\u0650',
              u'\u064d',
              u']',
              u'[',
              u'\u0644\u0623',
              u'\u0623',
              u'\u0640',
              u'\u060c',
              u'/',
              u':',
              u'~',
              u"'"],
             [u'\u0652',
              u'}',
              u'{',
              u'\u0644\u0622',
              u'\u0622',
              u'\u2019',
              u',',
              u'.',
              u'\u061f',
              u':',
              u'_',
              u'CLEAR'],
             [u'SHIFT',
              u'SPACE',
              u'?',
              u'\\',
              u'=',
              u'\u0651',
              u'~',
              u'OK']]
            self.nextLang = 'cs_CZ'
        elif self.lang == 'cs_CZ':
            self.keys_list = [[u'EXIT',
              u'1',
              u'2',
              u'3',
              u'4',
              u'5',
              u'6',
              u'7',
              u'8',
              u'9',
              u'0',
              u'BACKSPACE'],
             [u'q',
              u'w',
              u'e',
              u'r',
              u't',
              u'z',
              u'u',
              u'i',
              u'o',
              u'p',
              u'\xfa',
              u'+'],
             [u'a',
              u's',
              u'd',
              u'f',
              u'g',
              u'h',
              u'j',
              u'k',
              u'l',
              u'\u016f',
              u'\xa7',
              u'/'],
             [u'<',
              u'y',
              u'x',
              u'c',
              u'v',
              u'b',
              u'n',
              u'm',
              u',',
              '.',
              u'-',
              u'ALL'],
             [u'SHIFT',
              u'SPACE',
              u'\u011b',
              u'\u0161',
              u'\u010d',
              u'\u0159',
              u'\u017e',
              u'\xfd',
              u'\xe1',
              u'\xed',
              u'\xe9',
              u'OK']]
            self.shiftkeys_list = [[u'EXIT',
              u'!',
              u'@',
              u'#',
              u'$',
              u'%',
              u'^',
              u'&',
              u'(',
              u')',
              u'=',
              u'BACKSPACE'],
             [u'Q',
              u'W',
              u'E',
              u'R',
              u'T',
              u'Z',
              u'U',
              u'I',
              u'O',
              u'P',
              u'\xda',
              u'*'],
             [u'A',
              u'S',
              u'D',
              u'F',
              u'G',
              u'H',
              u'J',
              u'K',
              u'L',
              u'\u016e',
              u'\\',
              u"'"],
             [u'>',
              u'Y',
              u'X',
              u'C',
              u'V',
              u'B',
              u'N',
              u'M',
              u';',
              u':',
              u'_',
              u'CLEAR'],
             [u'SHIFT',
              u'SPACE',
              u'\u011a',
              u'\u0160',
              u'\u010c',
              u'\u0158',
              u'\u017d',
              u'\xdd',
              u'\xc1',
              u'\xcd',
              u'\xc9',
              u'OK']]
            self.thirdkeys_list = [[u'EXIT',
              u'SPACE',
              u'SPACE',
              u'SPACE',
              u'\u0164',
              u'SPACE',
              u'SPACE',
              u'SPACE',
              u'\xd3',
              u'SPACE',
              u'SPACE',
              u'BACKSPACE'],
             [u'\\',
              u'|',
              u'\u010e',
              u'SPACE',
              u'\u0165',
              u'SPACE',
              u'\u0147',
              u'SPACE',
              u'\xf3',
              u'SPACE',
              u'/',
              u'ALL'],
             [u'SPACE',
              u'SPACE',
              u'\u010f',
              u'[',
              u']',
              u'SPACE',
              u'\u0148',
              u'SPACE',
              u'SPACE',
              u'SPACE',
              u'"',
              u'CLEAR'],
             [u'SPACE',
              u'SPACE',
              u'SPACE',
              u'SPACE',
              u'SPACE',
              u'{',
              u'}',
              u'SPACE',
              u'SPACE',
              u'?',
              u'SPACE',
              u'BACKSPACE'],
             [u'SHIFT',
              u'SPACE',
              u'SPACE',
              u'SPACE',
              u'SPACE',
              u'SPACE',
              u'SPACE',
              u'SPACE',
              u'<',
              u'>',
              u'SPACE',
              u'OK']]
            self.nextLang = 'de_DE'
        elif self.lang == 'de_DE':
            self.keys_list = [[u'EXIT',
              u'1',
              u'2',
              u'3',
              u'4',
              u'5',
              u'6',
              u'7',
              u'8',
              u'9',
              u'0',
              u'BACKSPACE'],
             [u'q',
              u'w',
              u'e',
              u'r',
              u't',
              u'z',
              u'u',
              u'i',
              u'o',
              u'p',
              u'\xfc',
              u'+'],
             [u'a',
              u's',
              u'd',
              u'f',
              u'g',
              u'h',
              u'j',
              u'k',
              u'l',
              u'\xf6',
              u'\xe4',
              u'#'],
             [u'<',
              u'y',
              u'x',
              u'c',
              u'v',
              u'b',
              u'n',
              u'm',
              u',',
              '.',
              u'-',
              u'ALL'],
             [u'SHIFT',
              u'SPACE',
              u'@',
              u'\xdf',
              u'OK',
              u'LEFT',
              u'RIGHT']]
            self.shiftkeys_list = [[u'EXIT',
              u'!',
              u'"',
              u'\xa7',
              u'$',
              u'%',
              u'&',
              u'/',
              u'(',
              u')',
              u'=',
              u'BACKSPACE'],
             [u'Q',
              u'W',
              u'E',
              u'R',
              u'T',
              u'Z',
              u'U',
              u'I',
              u'O',
              u'P',
              u'\xdc',
              u'*'],
             [u'A',
              u'S',
              u'D',
              u'F',
              u'G',
              u'H',
              u'J',
              u'K',
              u'L',
              u'\xd6',
              u'\xc4',
              u"'"],
             [u'>',
              u'Y',
              u'X',
              u'C',
              u'V',
              u'B',
              u'N',
              u'M',
              u';',
              u':',
              u'_',
              u'CLEAR'],
             [u'SHIFT',
              u'SPACE',
              u'?',
              u'\\',
              u'OK',
              u'LEFT',
              u'RIGHT']]
            self.nextLang = 'el_GR'
        elif self.lang == 'el_GR':
            self.keys_list = [[u'EXIT',
              u'1',
              u'2',
              u'3',
              u'4',
              u'5',
              u'6',
              u'7',
              u'8',
              u'9',
              u'0',
              u'BACKSPACE'],
             [u'=',
              u'\u03c2',
              u'\u03b5',
              u'\u03c1',
              u'\u03c4',
              u'\u03c5',
              u'\u03b8',
              u'\u03b9',
              u'\u03bf',
              u'\u03c0',
              u'[',
              u']'],
             [u'\u03b1',
              u'\u03c3',
              u'\u03b4',
              u'\u03c6',
              u'\u03b3',
              u'\u03b7',
              u'\u03be',
              u'\u03ba',
              u'\u03bb',
              u';',
              u"'",
              u'-'],
             [u'\\',
              u'\u03b6',
              u'\u03c7',
              u'\u03c8',
              u'\u03c9',
              u'\u03b2',
              u'\u03bd',
              u'\u03bc',
              u',',
              '.',
              u'/',
              u'ALL'],
             [u'SHIFT',
              u'SPACE',
              u'\u03ac',
              u'\u03ad',
              u'\u03ae',
              u'\u03af',
              u'\u03cc',
              u'\u03cd',
              u'\u03ce',
              u'\u03ca',
              u'\u03cb',
              u'OK']]
            self.shiftkeys_list = [[u'EXIT',
              u'!',
              u'@',
              u'#',
              u'$',
              u'%',
              u'^',
              u'&',
              u'*',
              u'(',
              u')',
              u'BACKSPACE'],
             [u'+',
              u'\u20ac',
              u'\u0395',
              u'\u03a1',
              u'\u03a4',
              u'\u03a5',
              u'\u0398',
              u'\u0399',
              u'\u039f',
              u'\u03a0',
              u'{',
              u'}'],
             [u'\u0391',
              u'\u03a3',
              u'\u0394',
              u'\u03a6',
              u'\u0393',
              u'\u0397',
              u'\u039e',
              u'\u039a',
              u'\u039b',
              u':',
              u'"',
              u'_'],
             [u'|',
              u'\u0396',
              u'\u03a7',
              u'\u03a8',
              u'\u03a9',
              u'\u0392',
              u'\u039d',
              u'\u039c',
              u'<',
              u'>',
              u'?',
              u'CLEAR'],
             [u'SHIFT',
              u'SPACE',
              u'\u0386',
              u'\u0388',
              u'\u0389',
              u'\u038a',
              u'\u038c',
              u'\u038e',
              u'\u038f',
              u'\u03aa',
              u'\u03ab',
              u'OK']]
            self.nextLang = 'es_ES'
        elif self.lang == 'es_ES':
            self.keys_list = [[u'EXIT',
              u'1',
              u'2',
              u'3',
              u'4',
              u'5',
              u'6',
              u'7',
              u'8',
              u'9',
              u'0',
              u'BACKSPACE'],
             [u'q',
              u'w',
              u'e',
              u'r',
              u't',
              u'z',
              u'u',
              u'i',
              u'o',
              u'p',
              u'\xfa',
              u'+'],
             [u'a',
              u's',
              u'd',
              u'f',
              u'g',
              u'h',
              u'j',
              u'k',
              u'l',
              u'\xf3',
              u'\xe1',
              u'#'],
             [u'<',
              u'y',
              u'x',
              u'c',
              u'v',
              u'b',
              u'n',
              u'm',
              u',',
              '.',
              u'-',
              u'ALL'],
             [u'SHIFT',
              u'SPACE',
              u'@',
              u'\u0141',
              u'\u0155',
              u'\xe9',
              u'\u010d',
              u'\xed',
              u'\u011b',
              u'\u0144',
              u'\u0148',
              u'OK']]
            self.shiftkeys_list = [[u'EXIT',
              u'!',
              u'"',
              u'\xa7',
              u'$',
              u'%',
              u'&',
              u'/',
              u'(',
              u')',
              u'=',
              u'BACKSPACE'],
             [u'Q',
              u'W',
              u'E',
              u'R',
              u'T',
              u'Z',
              u'U',
              u'I',
              u'O',
              u'P',
              u'\xda',
              u'*'],
             [u'A',
              u'S',
              u'D',
              u'F',
              u'G',
              u'H',
              u'J',
              u'K',
              u'L',
              u'\xd3',
              u'\xc1',
              u"'"],
             [u'>',
              u'Y',
              u'X',
              u'C',
              u'V',
              u'B',
              u'N',
              u'M',
              u';',
              u':',
              u'_',
              u'CLEAR'],
             [u'SHIFT',
              u'SPACE',
              u'?',
              u'\\',
              u'\u0154',
              u'\xc9',
              u'\u010c',
              u'\xcd',
              u'\u011a',
              u'\u0143',
              u'\u0147',
              u'OK']]
            self.nextLang = 'fa_IR'
        elif self.lang == 'fa_IR':
            self.keys_list = [[u'EXIT',
              u'\u06f1',
              u'\u06f2',
              u'\u06f3',
              u'\u06f4',
              u'\u06f5',
              u'\u06f6',
              u'\u06f7',
              u'\u06f8',
              u'\u06f9',
              u'\u06f0',
              u'BACKSPACE'],
             [u'\u0636',
              u'\u0635',
              u'\u062b',
              u'\u0642',
              u'\u0641',
              u'\u063a',
              u'\u0639',
              u'\u0647',
              u'\u062e',
              u'\u062d',
              u'-',
              u'\u062c'],
             [u'\u0634',
              u'\u0633',
              u'\u06cc',
              u'\u0628',
              u'\u0644',
              u'\u0627',
              u'\u062a',
              u'\u0646',
              u'\u0645',
              u'\u06a9',
              u'\u06af',
              u'\u067e'],
             [u'<',
              u'\u0638',
              u'\u0637',
              u'\u0632',
              u'\u0631',
              u'\u0630',
              u'\u062f',
              u'\u0626',
              u'\u0648',
              '.',
              u'/',
              u'ALL'],
             [u'SHIFT',
              u'SPACE',
              u'OK',
              u'LEFT',
              u'RIGHT',
              u'*']]
            self.shiftkeys_list = [[u'EXIT',
              u'!',
              u'@',
              u'#',
              u'$',
              u'%',
              u'^',
              u'&',
              u'(',
              u')',
              u'=',
              u'BACKSPACE'],
             [u'\u0636',
              u'\u0635',
              u'\u062b',
              u'\u0642',
              u'\u060c',
              u'\u061b',
              u'\u0639',
              u'\u0647',
              u'\u062e',
              u'\u062d',
              u'+',
              u'\u0686'],
             [u'\u0634',
              u'\u0633',
              u'\u06cc',
              u'\u0628',
              u'\u06c0',
              u'\u0622',
              u'\u062a',
              u'\u0646',
              u'\u0645',
              u'?',
              u'"',
              u'|'],
             [u'>',
              u'\u0629',
              u'\u064a',
              u'\u0698',
              u'\u0624',
              u'\u0625',
              u'\u0623',
              u'\u0621',
              u';',
              u':',
              u'\u061f',
              u'CLEAR'],
             [u'SHIFT',
              u'SPACE',
              u'OK',
              u'LEFT',
              u'RIGHT',
              u'~']]
            self.nextLang = 'fi_FI'
        elif self.lang == 'fi_FI':
            self.keys_list = [[u'EXIT',
              u'1',
              u'2',
              u'3',
              u'4',
              u'5',
              u'6',
              u'7',
              u'8',
              u'9',
              u'0',
              u'BACKSPACE'],
             [u'q',
              u'w',
              u'e',
              u'r',
              u't',
              u'z',
              u'u',
              u'i',
              u'o',
              u'p',
              u'\xe9',
              u'+'],
             [u'a',
              u's',
              u'd',
              u'f',
              u'g',
              u'h',
              u'j',
              u'k',
              u'l',
              u'\xf6',
              u'\xe4',
              u'#'],
             [u'<',
              u'y',
              u'x',
              u'c',
              u'v',
              u'b',
              u'n',
              u'm',
              u',',
              '.',
              u'-',
              u'ALL'],
             [u'SHIFT',
              u'SPACE',
              u'@',
              u'\xdf',
              u'\u013a',
              u'OK',
              u'LEFT',
              u'RIGHT']]
            self.shiftkeys_list = [[u'EXIT',
              u'!',
              u'"',
              u'\xa7',
              u'$',
              u'%',
              u'&',
              u'/',
              u'(',
              u')',
              u'=',
              u'BACKSPACE'],
             [u'Q',
              u'W',
              u'E',
              u'R',
              u'T',
              u'Z',
              u'U',
              u'I',
              u'O',
              u'P',
              u'\xc9',
              u'*'],
             [u'A',
              u'S',
              u'D',
              u'F',
              u'G',
              u'H',
              u'J',
              u'K',
              u'L',
              u'\xd6',
              u'\xc4',
              u"'"],
             [u'>',
              u'Y',
              u'X',
              u'C',
              u'V',
              u'B',
              u'N',
              u'M',
              u';',
              u':',
              u'_',
              u'CLEAR'],
             [u'SHIFT',
              u'SPACE',
              u'?',
              u'\\',
              u'\u0139',
              u'OK',
              u'LEFT',
              u'RIGHT']]
            self.nextLang = 'fr_FR'
        elif self.lang == 'fr_FR':
            self.keys_list = [[u'EXIT',
              u'1',
              u'2',
              u'3',
              u'4',
              u'5',
              u'6',
              u'7',
              u'8',
              u'9',
              u'0',
              u'BACKSPACE'],
             [u'a',
              u'z',
              u'e',
              u'r',
              u't',
              u'y',
              u'u',
              u'i',
              u'o',
              u'p',
              u'\xe9',
              u'\xe8'],
             [u'q',
              u's',
              u'd',
              u'f',
              u'g',
              u'h',
              u'j',
              u'k',
              u'l',
              u'm',
              u'\xea',
              u'\xeb'],
             [u'<',
              u'w',
              u'x',
              u'c',
              u'v',
              u'b',
              u'n',
              u',',
              u';',
              u':',
              u'=',
              u'ALL'],
             [u'SHIFT',
              u'SPACE',
              u'\xf9',
              u'\xe2',
              u'\xef',
              u'\xf4',
              u'\xe7',
              u'#',
              u'-',
              u'OK',
              u'LEFT',
              u'RIGHT']]
            self.shiftkeys_list = [[u'EXIT',
              u'&',
              u'@',
              u'"',
              u'\u20ac',
              u'\xa7',
              u'!',
              u'\xe7',
              u'(',
              u')',
              u'_',
              u'BACKSPACE'],
             [u'A',
              u'Z',
              u'E',
              u'R',
              u'T',
              u'Y',
              u'U',
              u'I',
              u'O',
              u'P',
              u'\xc9',
              u'\xc8'],
             [u'Q',
              u'S',
              u'D',
              u'F',
              u'G',
              u'H',
              u'J',
              u'K',
              u'L',
              u'M',
              u'\xca',
              u'\xcb'],
             [u'>',
              u'W',
              u'X',
              u'C',
              u'V',
              u'B',
              u'N',
              u'?',
              u'.',
              u'+',
              u'~',
              u'CLEAR'],
             [u'SHIFT',
              u'SPACE',
              u'\xd9',
              u'\xc2',
              u'\xcf',
              u'\xd4',
              u'\xb0',
              u'/',
              u'\\',
              u'OK',
              u'LEFT',
              u'RIGHT']]
            self.nextLang = 'lv_LV'
        elif self.lang == 'lv_LV':
            self.keys_list = [[u'EXIT',
              u'1',
              u'2',
              u'3',
              u'4',
              u'5',
              u'6',
              u'7',
              u'8',
              u'9',
              u'0',
              u'BACKSPACE'],
             [u'q',
              u'w',
              u'e',
              u'r',
              u't',
              u'y',
              u'u',
              u'i',
              u'o',
              u'p',
              u'-',
              u'\u0161'],
             [u'a',
              u's',
              u'd',
              u'f',
              u'g',
              u'h',
              u'j',
              u'k',
              u'l',
              u';',
              u"'",
              u'\u016b'],
             [u'<',
              u'z',
              u'x',
              u'c',
              u'v',
              u'b',
              u'n',
              u'm',
              u',',
              u'.',
              u'\u017e',
              u'ALL'],
             [u'SHIFT',
              u'SPACE',
              u'\u0101',
              u'\u010d',
              u'\u0113',
              u'\u0123',
              u'\u012b',
              u'\u0137',
              u'\u013c',
              u'\u0146',
              u'LEFT',
              u'RIGHT']]
            self.shiftkeys_list = [[u'EXIT',
              u'!',
              u'@',
              u'$',
              u'*',
              u'(',
              u')',
              u'_',
              u'=',
              u'/',
              u'\\',
              u'BACKSPACE'],
             [u'Q',
              u'W',
              u'E',
              u'R',
              u'T',
              u'Y',
              u'U',
              u'I',
              u'O',
              u'P',
              u'+',
              u'\u0160'],
             [u'A',
              u'S',
              u'D',
              u'F',
              u'G',
              u'H',
              u'J',
              u'K',
              u'L',
              u':',
              u'"',
              u'\u016a'],
             [u'>',
              u'Z',
              u'X',
              u'C',
              u'V',
              u'B',
              u'N',
              u'M',
              u'#',
              u'?',
              u'\u017d',
              u'CLEAR'],
             [u'SHIFT',
              u'SPACE',
              u'\u0100',
              u'\u010c',
              u'\u0112',
              u'\u0122',
              u'\u012a',
              u'\u0136',
              u'\u013b',
              u'\u0145',
              u'LEFT',
              u'RIGHT']]
            self.nextLang = 'pl_PL'
        elif self.lang == 'pl_PL':
            self.keys_list = [[u'EXIT',
              u'1',
              u'2',
              u'3',
              u'4',
              u'5',
              u'6',
              u'7',
              u'8',
              u'9',
              u'0',
              u'BACKSPACE'],
             [u'q',
              u'w',
              u'e',
              u'r',
              u't',
              u'y',
              u'u',
              u'i',
              u'o',
              u'p',
              u'-',
              u'['],
             [u'a',
              u's',
              u'd',
              u'f',
              u'g',
              u'h',
              u'j',
              u'k',
              u'l',
              u';',
              u"'",
              u'\\'],
             [u'<',
              u'z',
              u'x',
              u'c',
              u'v',
              u'b',
              u'n',
              u'm',
              u',',
              '.',
              u'/',
              u'ALL'],
             [u'SHIFT',
              u'SPACE',
              u'\u0105',
              u'\u0107',
              u'\u0119',
              u'\u0142',
              u'\u0144',
              u'\xf3',
              u'\u015b',
              u'\u017a',
              u'\u017c',
              u'OK']]
            self.shiftkeys_list = [[u'EXIT',
              u'!',
              u'@',
              u'#',
              u'$',
              u'%',
              u'^',
              u'&',
              u'(',
              u')',
              u'=',
              u'BACKSPACE'],
             [u'Q',
              u'W',
              u'E',
              u'R',
              u'T',
              u'Y',
              u'U',
              u'I',
              u'O',
              u'P',
              u'*',
              u']'],
             [u'A',
              u'S',
              u'D',
              u'F',
              u'G',
              u'H',
              u'J',
              u'K',
              u'L',
              u'?',
              u'"',
              u'|'],
             [u'>',
              u'Z',
              u'X',
              u'C',
              u'V',
              u'B',
              u'N',
              u'M',
              u';',
              u':',
              u'_',
              u'CLEAR'],
             [u'SHIFT',
              u'SPACE',
              u'\u0104',
              u'\u0106',
              u'\u0118',
              u'\u0141',
              u'\u0143',
              u'\xd3',
              u'\u015a',
              u'\u0179',
              u'\u017b',
              u'OK']]
            self.nextLang = 'ru_RU'
        elif self.lang == 'ru_RU':
            self.keys_list = [[u'EXIT',
              u'1',
              u'2',
              u'3',
              u'4',
              u'5',
              u'6',
              u'7',
              u'8',
              u'9',
              u'0',
              u'BACKSPACE'],
             [u'\u0430',
              u'\u0431',
              u'\u0432',
              u'\u0433',
              u'\u0434',
              u'\u0435',
              u'\u0451',
              u'\u0436',
              u'\u0437',
              u'\u0438',
              u'\u0439',
              u'+'],
             [u'\u043a',
              u'\u043b',
              u'\u043c',
              u'\u043d',
              u'\u043e',
              u'\u043f',
              u'\u0440',
              u'\u0441',
              u'\u0442',
              u'\u0443',
              u'\u0444',
              u'#'],
             [u'<',
              u'\u0445',
              u'\u0446',
              u'\u0447',
              u'\u0448',
              u'\u0449',
              u'\u044a',
              u'\u044b',
              u',',
              u'.',
              u'-',
              u'ALL'],
             [u'SHIFT',
              u'SPACE',
              u'@',
              u'\u044c',
              u'\u044d',
              u'\u044e',
              u'\u044f',
              u'OK',
              u'LEFT',
              u'RIGHT']]
            self.shiftkeys_list = [[u'EXIT',
              u'!',
              u'"',
              u'\xa7',
              u'$',
              u'%',
              u'&',
              u'/',
              u'(',
              u')',
              u'=',
              u'BACKSPACE'],
             [u'\u0410',
              u'\u0411',
              u'\u0412',
              u'\u0413',
              u'\u0414',
              u'\u0415',
              u'\u0401',
              u'\u0416',
              u'\u0417',
              u'\u0418',
              u'\u0419',
              u'*'],
             [u'\u041a',
              u'\u041b',
              u'\u041c',
              u'\u041d',
              u'\u041e',
              u'\u041f',
              u'\u0420',
              u'\u0421',
              u'\u0422',
              u'\u0423',
              u'\u0424',
              u"'"],
             [u'>',
              u'\u0425',
              u'\u0426',
              u'\u0427',
              u'\u0428',
              u'\u0429',
              u'\u042a',
              u'\u042b',
              u';',
              u':',
              u'_',
              u'CLEAR'],
             [u'SHIFT',
              u'SPACE',
              u'?',
              u'\\',
              u'\u042c',
              u'\u042d',
              u'\u042e',
              u'\u042f',
              u'OK',
              u'LEFT',
              u'RIGHT']]
            self.nextLang = 'sk_SK'
        elif self.lang == 'sk_SK':
            self.keys_list = [[u'EXIT',
              u'1',
              u'2',
              u'3',
              u'4',
              u'5',
              u'6',
              u'7',
              u'8',
              u'9',
              u'0',
              u'BACKSPACE'],
             [u'q',
              u'w',
              u'e',
              u'r',
              u't',
              u'z',
              u'u',
              u'i',
              u'o',
              u'p',
              u'\xfa',
              u'+'],
             [u'a',
              u's',
              u'd',
              u'f',
              u'g',
              u'h',
              u'j',
              u'k',
              u'l',
              u'\u013e',
              u'@',
              u'#'],
             [u'<',
              u'y',
              u'x',
              u'c',
              u'v',
              u'b',
              u'n',
              u'm',
              u',',
              '.',
              u'-',
              u'ALL'],
             [u'SHIFT',
              u'SPACE',
              u'\u0161',
              u'\u010d',
              u'\u017e',
              u'\xfd',
              u'\xe1',
              u'\xed',
              u'\xe9',
              u'OK',
              u'LEFT',
              u'RIGHT']]
            self.shiftkeys_list = [[u'EXIT',
              u'!',
              u'"',
              u'\xa7',
              u'$',
              u'%',
              u'&',
              u'/',
              u'(',
              u')',
              u'=',
              u'BACKSPACE'],
             [u'Q',
              u'W',
              u'E',
              u'R',
              u'T',
              u'Z',
              u'U',
              u'I',
              u'O',
              u'P',
              u'\u0165',
              u'*'],
             [u'A',
              u'S',
              u'D',
              u'F',
              u'G',
              u'H',
              u'J',
              u'K',
              u'L',
              u'\u0148',
              u'\u010f',
              u"'"],
             [u'\xc1',
              u'\xc9',
              u'\u010e',
              u'\xcd',
              u'\xdd',
              u'\xd3',
              u'\xda',
              u'\u017d',
              u'\u0160',
              u'\u010c',
              u'\u0164',
              u'\u0147'],
             [u'>',
              u'Y',
              u'X',
              u'C',
              u'V',
              u'B',
              u'N',
              u'M',
              u';',
              u':',
              u'_',
              u'CLEAR'],
             [u'SHIFT',
              u'SPACE',
              u'?',
              u'\\',
              u'\xe4',
              u'\xf6',
              u'\xfc',
              u'\xf4',
              u'\u0155',
              u'\u013a',
              u'OK']]
            self.nextLang = 'sv_SE'
        elif self.lang == 'sv_SE':
            self.keys_list = [[u'EXIT',
              u'1',
              u'2',
              u'3',
              u'4',
              u'5',
              u'6',
              u'7',
              u'8',
              u'9',
              u'0',
              u'BACKSPACE'],
             [u'q',
              u'w',
              u'e',
              u'r',
              u't',
              u'z',
              u'u',
              u'i',
              u'o',
              u'p',
              u'\xe9',
              u'+'],
             [u'a',
              u's',
              u'd',
              u'f',
              u'g',
              u'h',
              u'j',
              u'k',
              u'l',
              u'\xf6',
              u'\xe4',
              u'#'],
             [u'<',
              u'y',
              u'x',
              u'c',
              u'v',
              u'b',
              u'n',
              u'm',
              u',',
              '.',
              u'-',
              u'ALL'],
             [u'SHIFT',
              u'SPACE',
              u'@',
              u'\xdf',
              u'\u013a',
              u'OK',
              u'LEFT',
              u'RIGHT']]
            self.shiftkeys_list = [[u'EXIT',
              u'!',
              u'"',
              u'\xa7',
              u'$',
              u'%',
              u'&',
              u'/',
              u'(',
              u')',
              u'=',
              u'BACKSPACE'],
             [u'Q',
              u'W',
              u'E',
              u'R',
              u'T',
              u'Z',
              u'U',
              u'I',
              u'O',
              u'P',
              u'\xc9',
              u'*'],
             [u'A',
              u'S',
              u'D',
              u'F',
              u'G',
              u'H',
              u'J',
              u'K',
              u'L',
              u'\xd6',
              u'\xc4',
              u"'"],
             [u'>',
              u'Y',
              u'X',
              u'C',
              u'V',
              u'B',
              u'N',
              u'M',
              u';',
              u':',
              u'_',
              u'CLEAR'],
             [u'SHIFT',
              u'SPACE',
              u'?',
              u'\\',
              u'\u0139',
              u'OK',
              u'LEFT',
              u'RIGHT']]
            self.nextLang = 'th_TH'
        elif self.lang == 'th_TH':
            self.keys_list = [[u'EXIT',
              '\xe0\xb9\x85',
              '\xe0\xb8\xa0',
              '\xe0\xb8\x96',
              '\xe0\xb8\xb8',
              '\xe0\xb8\xb6',
              '\xe0\xb8\x84',
              '\xe0\xb8\x95',
              '\xe0\xb8\x88',
              '\xe0\xb8\x82',
              '\xe0\xb8\x8a',
              u'BACKSPACE'],
             ['\xe0\xb9\x86',
              '\xe0\xb9\x84',
              '\xe0\xb8\xb3',
              '\xe0\xb8\x9e',
              '\xe0\xb8\xb0',
              '\xe0\xb8\xb1',
              '\xe0\xb8\xb5',
              '\xe0\xb8\xa3',
              '\xe0\xb8\x99',
              '\xe0\xb8\xa2',
              '\xe0\xb8\x9a',
              '\xe0\xb8\xa5'],
             ['\xe0\xb8\x9f',
              '\xe0\xb8\xab',
              '\xe0\xb8\x81',
              '\xe0\xb8\x94',
              '\xe0\xb9\x80',
              '\xe0\xb9\x89',
              '\xe0\xb9\x88',
              '\xe0\xb8\xb2',
              '\xe0\xb8\xaa',
              '\xe0\xb8\xa7',
              '\xe0\xb8\x87',
              '\xe0\xb8\x83'],
             ['\xe0\xb8\x9c',
              '\xe0\xb8\x9b',
              '\xe0\xb9\x81',
              '\xe0\xb8\xad',
              '\xe0\xb8\xb4',
              '\xe0\xb8\xb7',
              '\xe0\xb8\x97',
              '\xe0\xb8\xa1',
              '\xe0\xb9\x83',
              '\xe0\xb8\x9d',
              '',
              u'ALL'],
             [u'SHIFT',
              u'SPACE',
              u'OK',
              u'LEFT',
              u'RIGHT']]
            self.shiftkeys_list = [[u'EXIT',
              '\xe0\xb9\x91',
              '\xe0\xb9\x92',
              '\xe0\xb9\x93',
              '\xe0\xb9\x94',
              '\xe0\xb8\xb9',
              '\xe0\xb9\x95',
              '\xe0\xb9\x96',
              '\xe0\xb9\x97',
              '\xe0\xb9\x98',
              '\xe0\xb9\x99',
              u'BACKSPACE'],
             ['\xe0\xb9\x90',
              '',
              '\xe0\xb8\x8e',
              '\xe0\xb8\x91',
              '\xe0\xb8\x98',
              '\xe0\xb9\x8d',
              '\xe0\xb9\x8a',
              '\xe0\xb8\x93',
              '\xe0\xb8\xaf',
              '\xe0\xb8\x8d',
              '\xe0\xb8\x90',
              '\xe0\xb8\x85'],
             ['\xe0\xb8\xa4',
              '\xe0\xb8\x86',
              '\xe0\xb8\x8f',
              '\xe0\xb9\x82',
              '\xe0\xb8\x8c',
              '\xe0\xb9\x87',
              '\xe0\xb9\x8b',
              '\xe0\xb8\xa9',
              '\xe0\xb8\xa8',
              '\xe0\xb8\x8b',
              '',
              '\xe0\xb8\xbf'],
             ['',
              '',
              '\xe0\xb8\x89',
              '\xe0\xb8\xae',
              '\xe0\xb8\xba',
              '\xe0\xb9\x8c',
              '',
              '\xe0\xb8\x92',
              '\xe0\xb8\xac',
              '\xe0\xb8\xa6',
              '',
              u'CLEAR'],
             [u'SHIFT',
              u'SPACE',
              u'OK',
              u'LEFT',
              u'RIGHT']]
            self.nextLang = 'uk_UA'
        elif self.lang == 'uk_UA':
            self.keys_list = [[u'EXIT',
              u'1',
              u'2',
              u'3',
              u'4',
              u'5',
              u'6',
              u'7',
              u'8',
              u'9',
              u'0',
              u'BACKSPACE'],
             [u'\u0430',
              u'\u0431',
              u'\u0432',
              u'\u0433',
              u'\u0491',
              u'\u0434',
              u'\u0435',
              u'\u0454',
              u'\u0436',
              u'\u0437',
              u'\u0438',
              u'+'],
             [u'\u0456',
              u'\u0457',
              u'\u0439',
              u'\u043a',
              u'\u043b',
              u'\u043c',
              u'\u043d',
              u'\u043e',
              u'\u043f',
              u'\u0440',
              u'\u0441',
              u'#'],
             [u'<',
              u'\u0442',
              u'\u0443',
              u'\u0444',
              u'\u0445',
              u'\u0446',
              u'\u0447',
              u'\u0448',
              u',',
              u'.',
              u'-',
              u'ALL'],
             [u'SHIFT',
              u'SPACE',
              u'@',
              u'\u0449',
              u'\u044c',
              u'\u044e',
              u'\u044f',
              u'OK',
              u'LEFT',
              u'RIGHT']]
            self.shiftkeys_list = [[u'EXIT',
              u'!',
              u'"',
              u'\xa7',
              u'$',
              u'%',
              u'&',
              u'/',
              u'(',
              u')',
              u'=',
              u'BACKSPACE'],
             [u'\u0410',
              u'\u0411',
              u'\u0412',
              u'\u0413',
              u'\u0490',
              u'\u0414',
              u'\u0415',
              u'\u0404',
              u'\u0416',
              u'\u0417',
              u'\u0418',
              u'*'],
             [u'\u0406',
              u'\u0407',
              u'\u0419',
              u'\u041a',
              u'\u041b',
              u'\u041c',
              u'\u041d',
              u'\u041e',
              u'\u041f',
              u'\u0420',
              u'\u0421',
              u"'"],
             [u'>',
              u'\u0422',
              u'\u0423',
              u'\u0424',
              u'\u0425',
              u'\u0426',
              u'\u0427',
              u'\u0428',
              u';',
              u':',
              u'_',
              u'CLEAR'],
             [u'SHIFT',
              u'SPACE',
              u'?',
              u'\\',
              u'\u0429',
              u'\u042c',
              u'\u042e',
              u'\u042f',
              u'OK',
              u'LEFT',
              u'RIGHT']]
            self.nextLang = 'en_EN'
        else:
            self.keys_list = [[u'EXIT',
              u'1',
              u'2',
              u'3',
              u'4',
              u'5',
              u'6',
              u'7',
              u'8',
              u'9',
              u'0',
              u'BACKSPACE'],
             [u'q',
              u'w',
              u'e',
              u'r',
              u't',
              u'y',
              u'u',
              u'i',
              u'o',
              u'p',
              u'-',
              u'['],
             [u'a',
              u's',
              u'd',
              u'f',
              u'g',
              u'h',
              u'j',
              u'k',
              u'l',
              u';',
              u"'",
              u'\\'],
             [u'<',
              u'z',
              u'x',
              u'c',
              u'v',
              u'b',
              u'n',
              u'm',
              u',',
              '.',
              u'/',
              u'ALL'],
             [u'SHIFT',
              u'SPACE',
              u'OK',
              u'LEFT',
              u'RIGHT',
              u'*']]
            self.shiftkeys_list = [[u'EXIT',
              u'!',
              u'@',
              u'#',
              u'$',
              u'%',
              u'^',
              u'&',
              u'(',
              u')',
              u'=',
              u'BACKSPACE'],
             [u'Q',
              u'W',
              u'E',
              u'R',
              u'T',
              u'Y',
              u'U',
              u'I',
              u'O',
              u'P',
              u'+',
              u']'],
             [u'A',
              u'S',
              u'D',
              u'F',
              u'G',
              u'H',
              u'J',
              u'K',
              u'L',
              u'?',
              u'"',
              u'|'],
             [u'>',
              u'Z',
              u'X',
              u'C',
              u'V',
              u'B',
              u'N',
              u'M',
              u';',
              u':',
              u'_',
              u'CLEAR'],
             [u'SHIFT',
              u'SPACE',
              u'OK',
              u'LEFT',
              u'RIGHT',
              u'~']]
            self.lang = 'en_EN'
            self.nextLang = 'ar_AE'
        self['country'].setText(self.lang)
        self['key_yellow'].setText(self.lang)
        self.max_key = 47 + len(self.keys_list[4])

    def virtualKeyBoardEntryComponent_old(self, keys):
        w, h = skin.parameters.get('VirtualKeyboard', (45, 45))
        key_bg_width = self.key_bg and self.key_bg.size().width() or w
        key_images = self.shiftMode & 2 and self.keyImagesThird or self.shiftMode & 1 and self.keyImagesShift or self.keyImages
        res = [keys]
        text = []
        x = 0
        for key in keys:
            png = key_images.get(key, None)
            if png:
                width = png.size().width()
                res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, h), png=png))
            else:
                width = key_bg_width
                res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, h), png=self.key_bg))
                text.append(MultiContentEntryText(pos=(x, 0), size=(width, h), font=0, text=key.encode('utf-8'), flags=RT_HALIGN_CENTER | RT_VALIGN_CENTER))
            x += width

        return res + text

    def buildVirtualKeyBoard_old(self):
        self.previousSelectedKey = None
        self.list = []
        self.max_key = 0
        if self.shiftMode == 2 and not len(self.thirdkeys_list):
            self.shiftMode -= 1
        for keys in self.shiftMode & 2 and self.thirdkeys_list or self.shiftMode & 1 and self.shiftkeys_list or self.keys_list:
            self.list.append(self.virtualKeyBoardEntryComponent_old(keys))
            self.max_key += len(keys)

        self.max_key -= 1
        self.markSelectedKey_old()

    def markSelectedKey_old(self):
        w, h = skin.parameters.get('VirtualKeyboard', (45, 45))
        if self.previousSelectedKey is not None:
            self.list[self.previousSelectedKey / 12] = self.list[self.previousSelectedKey / 12][:-1]
        try:
            width = self.key_sel.size().width()
        except:
            width = w

        try:
            x = self.list[self.selectedKey / 12][self.selectedKey % 12 + 1][1]
        except IndexError:
            self.selectedKey = self.max_key
            x = self.list[self.selectedKey / 12][self.selectedKey % 12 + 1][1]

        self.list[self.selectedKey / 12].append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, h), png=self.key_sel))
        self.previousSelectedKey = self.selectedKey
        self['list'].setList(self.list)

    def shiftClicked_old(self):
        self.smsChar = None
        if len(self.thirdkeys_list):
            self.shiftMode += 1
            self.shiftMode %= 3
        else:
            self.shiftMode = not self.shiftMode
        self.buildVirtualKeyBoard_old()

    def okClicked_old(self):
        self.smsChar = None
        text = (self.shiftMode & 1 and self.shiftkeys_list or self.shiftMode & 2 and self.thirdkeys_list or self.keys_list)[self.selectedKey / 12][self.selectedKey % 12].encode('UTF-8')
        if text == 'EXIT':
            self.close(None)
        elif text == 'BACKSPACE':
            self['text'].deleteBackward()
        elif text == 'ALL':
            self['text'].markAll()
        elif text == 'CLEAR':
            self['text'].deleteAllChars()
            self['text'].update()
        elif text == 'SHIFT':
            self.shiftClicked()
        elif text == 'SPACE':
            self['text'].char(' '.encode('UTF-8'))
        elif text == 'OK':
            self.close(self['text'].getText())
        elif text == 'LEFT':
            self['text'].left()
        elif text == 'RIGHT':
            self['text'].right()
        else:
            self['text'].char(text)

    def ok(self):
        self.close(self['text'].getText())

    def exit(self):
        self.close(None)

    def cursorRight(self):
        self['text'].right()

    def cursorLeft(self):
        self['text'].left()

    def left_old(self):
        self.smsChar = None
        self.selectedKey = self.selectedKey / 12 * 12 + (self.selectedKey + 11) % 12
        if self.selectedKey > self.max_key:
            self.selectedKey = self.max_key
        self.markSelectedKey_old()

    def right_old(self):
        self.smsChar = None
        self.selectedKey = self.selectedKey / 12 * 12 + (self.selectedKey + 1) % 12
        if self.selectedKey > self.max_key:
            self.selectedKey = self.selectedKey / 12 * 12
        self.markSelectedKey_old()

    def up_old(self):
        self.smsChar = None
        self.selectedKey -= 12
        if self.selectedKey < 0:
            self.selectedKey = self.max_key / 12 * 12 + self.selectedKey % 12
            if self.selectedKey > self.max_key:
                self.selectedKey -= 12
        self.markSelectedKey_old()

    def down_old(self):
        self.smsChar = None
        self.selectedKey += 12
        if self.selectedKey > self.max_key:
            self.selectedKey %= 12
        self.markSelectedKey_old()

    def keyNumberGlobal_old(self, number):
        self.smsChar = self.sms.getKey(number)
        self.selectAsciiKey_old(self.smsChar)

    def smsOK(self):
        if self.smsChar and self.selectAsciiKey_old(self.smsChar):
            print('pressing ok now')
            self.okClicked()

    def keyGotAscii_old(self):
        self.smsChar = None
        if self.selectAsciiKey_old(str(pyunichar(getPrevAsciiCode()).encode('utf-8'))):
            self.okClicked()

    def selectAsciiKey_old(self, char):
        if char == ' ':
            char = 'SPACE'
        for keyslist in (self.shiftkeys_list, self.keys_list, self.thirdkeys_list):
            selkey = 0
            for keys in keyslist:
                for key in keys:
                    if key == char:
                        self.selectedKey = selkey
                        if keyslist is self.keys_list:
                            if self.shiftMode != 0:
                                self.shiftMode = 0
                                self.buildVirtualKeyBoard_old()
                            else:
                                self.markSelectedKey_old()
                        elif keyslist is self.shiftkeys_list:
                            if self.shiftMode != 1:
                                self.shiftMode = 1
                                self.buildVirtualKeyBoard_old()
                            else:
                                self.markSelectedKey()
                        elif keyslist is self.thirdkeys_list:
                            if self.shiftMode != 2:
                                self.shiftMode = 2
                                self.buildVirtualKeyBoard_old()
                            else:
                                self.markSelectedKey_old()
                        return True
                    selkey += 1

        return False

    def initclass_new(self):
        dwidth = getDesktop(0).size().width()
        if dwidth == 1280:
            self.skinName = 'vkeyboardnew_hdskin'
        else:
            self.skinName = 'vkeyboardnew_fhdskin'
        prompt = self.title
        print('VirtualKeyboard New')
        if dwidth == 1280:
            self.key_bg = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsHD/vkey_bg.png'))
            self.key_red_bg = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsHD/vkey_red.png'))
            self.key_green_bg = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsHD/vkey_green.png'))
            self.key_yellow_bg = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsHD/vkey_yellow.png'))
            self.key_blue_bg = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsHD/vkey_blue.png'))
            self.key_sel = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsHD/vkey_sel.png'))
            self.key_backspace = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsHD/vkey_backspace.png'))
            self.key_enter = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsHD/vkey_enter.png'))
            self.key_first = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsHD/vkey_first.png'))
            self.key_last = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsHD/vkey_last.png'))
            self.key_left = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsHD/vkey_left.png'))
            self.key_right = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsHD/vkey_right.png'))
            self.key_shift0 = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsHD/vkey_shift0.png'))
            self.key_shift1 = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsHD/vkey_shift1.png'))
            self.key_shift2 = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsHD/vkey_shift2.png'))
            self.key_shift3 = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsHD/vkey_shift3.png'))
            self.key_space = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsHD/vkey_space.png'))
            self.key_space_alt = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsHD/vkey_space_alt.png'))
        else:
            self.key_bg = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsFHD/vkey_bg.png'))
            self.key_red_bg = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsFHD/vkey_red.png'))
            self.key_green_bg = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'xtensions/KeyAdder/VirtualKeyBoard_Icons/buttonsFHD/vkey_green.png'))
            self.key_yellow_bg = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsFHD/vkey_yellow.png'))
            self.key_blue_bg = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsFHD/vkey_blue.png'))
            self.key_sel = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsFHD/vkey_sel.png'))
            self.key_backspace = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsFHD/vkey_backspace.png'))
            self.key_enter = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsFHD/vkey_enter.png'))
            self.key_first = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsFHD/vkey_first.png'))
            self.key_last = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsFHD/vkey_last.png'))
            self.key_left = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsFHD/vkey_left.png'))
            self.key_right = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsFHD/vkey_right.png'))
            self.key_shift0 = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsFHD/vkey_shift0.png'))
            self.key_shift1 = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsFHD/vkey_shift1.png'))
            self.key_shift2 = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsFHD/vkey_shift2.png'))
            self.key_shift3 = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsFHD/vkey_shift3.png'))
            self.key_space = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsFHD/vkey_space.png'))
            self.key_space_alt = LoadPixmap(resolveFilename(SCOPE_PLUGINS, 'Extensions/KeyAdder/VirtualKeyBoard_Icons/buttonsFHD/vkey_space_alt.png'))
        self.keyBackgrounds = {'EXIT': self.key_red_bg,
         'OK': self.key_green_bg,
         'SAVE': self.key_green_bg,
         'LOC': self.key_yellow_bg,
         'SHFT': self.key_blue_bg}
        self.keyImages = [{'BACKSPACE': self.key_backspace,
          'ENTER': self.key_enter,
          'FIRST': self.key_first,
          'LAST': self.key_last,
          'LEFT': self.key_left,
          'RIGHT': self.key_right,
          'SHIFT': self.key_shift0,
          'SPACE': self.key_space_alt},
         {'BACKSPACE': self.key_backspace,
          'ENTER': self.key_enter,
          'FIRST': self.key_first,
          'LAST': self.key_last,
          'LEFT': self.key_left,
          'RIGHT': self.key_right,
          'SHIFT': self.key_shift1,
          'SPACE': self.key_space_alt},
         {'BACKSPACE': self.key_backspace,
          'ENTER': self.key_enter,
          'FIRST': self.key_first,
          'LAST': self.key_last,
          'LEFT': self.key_left,
          'RIGHT': self.key_right,
          'SHIFT': self.key_shift2,
          'SPACE': self.key_space_alt},
         {'BACKSPACE': self.key_backspace,
          'ENTER': self.key_enter,
          'FIRST': self.key_first,
          'LAST': self.key_last,
          'LEFT': self.key_left,
          'RIGHT': self.key_right,
          'SHIFT': self.key_shift3,
          'SPACE': self.key_space_alt}]
        self.shiftMsgs = [_('Lower case'),
         _('Upper case'),
         _('Special 1'),
         _('Special 2')]
        self.english = [[[u'`',
           u'1',
           u'2',
           u'3',
           u'4',
           u'5',
           u'6',
           u'7',
           u'8',
           u'9',
           u'0',
           u'-',
           u'=',
           u'BACKSPACE'],
          [u'FIRST',
           u'q',
           u'w',
           u'e',
           u'r',
           u't',
           u'y',
           u'u',
           u'i',
           u'o',
           u'p',
           u'[',
           u']',
           u'\\'],
          [u'LAST',
           u'a',
           u's',
           u'd',
           u'f',
           u'g',
           u'h',
           u'j',
           u'k',
           u'l',
           u';',
           u"'",
           u'',
           u'ENTER'],
          [u'SHIFT',
           u'z',
           u'x',
           u'c',
           u'v',
           u'b',
           u'n',
           u'm',
           u',',
           u'.',
           u'/',
           u'',
           u'',
           u'SHIFT'],
          [u'EXIT',
           u'LOC',
           u'LEFT',
           u'RIGHT',
           u'ALL',
           u'CLR',
           u'SPACE']], [[u'~',
           u'!',
           u'@',
           u'#',
           u'$',
           u'%',
           u'^',
           u'&',
           u'*',
           u'(',
           u')',
           u'_',
           u'+',
           u'BACKSPACE'],
          [u'FIRST',
           u'Q',
           u'W',
           u'E',
           u'R',
           u'T',
           u'Y',
           u'U',
           u'I',
           u'O',
           u'P',
           u'{',
           u'}',
           u'|'],
          [u'LAST',
           u'A',
           u'S',
           u'D',
           u'F',
           u'G',
           u'H',
           u'J',
           u'K',
           u'L',
           u':',
           u'"',
           u'',
           u'ENTER'],
          [u'SHIFT',
           u'Z',
           u'X',
           u'C',
           u'V',
           u'B',
           u'N',
           u'M',
           u'<',
           u'>',
           u'?',
           u'',
           u'',
           u'SHIFT'],
          [u'EXIT',
           u'LOC',
           u'LEFT',
           u'RIGHT',
           u'ALL',
           u'CLR',
           u'SPACE']]]
        self.french = [[[u'\xb2',
           u'&',
           u'\xe9',
           u'"',
           u"'",
           u'(',
           u'-',
           u'\xe8',
           u'_',
           u'\xe7',
           u'\xe0',
           u')',
           u'=',
           u'BACKSPACE'],
          [u'FIRST',
           u'a',
           u'z',
           u'e',
           u'r',
           u't',
           u'y',
           u'u',
           u'i',
           u'o',
           u'p',
           u'$',
           u'[',
           u']'],
          [u'LAST',
           u'q',
           u's',
           u'd',
           u'f',
           u'g',
           u'h',
           u'j',
           u'k',
           u'l',
           u'm',
           u'\xf9',
           u'*',
           u'ENTER'],
          [u'SHIFT',
           u'<',
           u'w',
           u'x',
           u'c',
           u'v',
           u'b',
           u'n',
           u',',
           u';',
           u':',
           u'!',
           u'\u20ac',
           u'SHIFT'],
          [u'EXIT',
           u'LOC',
           u'LEFT',
           u'RIGHT',
           u'ALL',
           u'CLR',
           u'SPACE',
           u'#',
           u'@',
           u'`']], [[u'',
           u'1',
           u'2',
           u'3',
           u'4',
           u'5',
           u'6',
           u'7',
           u'8',
           u'9',
           u'0',
           u'\xb0',
           u'+',
           u'BACKSPACE'],
          [u'FIRST',
           u'A',
           u'Z',
           u'E',
           u'R',
           u'T',
           u'Y',
           u'U',
           u'I',
           u'O',
           u'P',
           u'\xa3',
           u'{',
           u'}'],
          [u'LAST',
           u'Q',
           u'S',
           u'D',
           u'F',
           u'G',
           u'H',
           u'J',
           u'K',
           u'L',
           u'M',
           u'%',
           u'\xb5',
           u'ENTER'],
          [u'SHIFT',
           u'>',
           u'W',
           u'X',
           u'C',
           u'V',
           u'B',
           u'N',
           u'?',
           u'.',
           u'/',
           u'\xa7',
           u'\xa6',
           u'SHIFT'],
          [u'EXIT',
           u'LOC',
           u'LEFT',
           u'RIGHT',
           u'ALL',
           u'CLR',
           u'SPACE',
           u'~',
           u'^',
           u'\\']], [[u'',
           u'',
           u'\xe2',
           u'\xea',
           u'\xee',
           u'\xf4',
           u'\xfb',
           u'\xe4',
           u'\xeb',
           u'\xef',
           u'\xf6',
           u'\xfc',
           u'',
           u'BACKSPACE'],
          [u'FIRST',
           u'',
           u'\xe0',
           u'\xe8',
           u'\xec',
           u'\xf2',
           u'\xf9',
           u'\xe1',
           u'\xe9',
           u'\xed',
           u'\xf3',
           u'\xfa',
           u'',
           u''],
          [u'LAST',
           u'',
           u'\xc2',
           u'\xca',
           u'\xce',
           u'\xd4',
           u'\xdb',
           u'\xc4',
           u'\xcb',
           u'\xcf',
           u'\xd6',
           u'\xdc',
           u'',
           u'ENTER'],
          [u'SHIFT',
           u'',
           u'\xc0',
           u'\xc8',
           u'\xcc',
           u'\xd2',
           u'\xd9',
           u'\xc1',
           u'\xc9',
           u'\xcd',
           u'\xd3',
           u'\xda',
           u'',
           u'SHIFT'],
          [u'EXIT',
           u'LOC',
           u'LEFT',
           u'RIGHT',
           u'ALL',
           u'CLR',
           u'SPACE']]]
        self.german = [[[u'',
           u'1',
           u'2',
           u'3',
           u'4',
           u'5',
           u'6',
           u'7',
           u'8',
           u'9',
           u'0',
           u'\xdf',
           u"'",
           u'BACKSPACE'],
          [u'FIRST',
           u'q',
           u'w',
           u'e',
           u'r',
           u't',
           u'z',
           u'u',
           u'i',
           u'o',
           u'p',
           u'\xfc',
           u'[',
           u']'],
          [u'LAST',
           u'a',
           u's',
           u'd',
           u'f',
           u'g',
           u'h',
           u'j',
           u'k',
           u'l',
           u'\xf6',
           u'\xe4',
           u'+',
           u'ENTER'],
          [u'SHIFT',
           u'<',
           u'y',
           u'x',
           u'c',
           u'v',
           u'b',
           u'n',
           u'm',
           u',',
           '.',
           u'-',
           u'#',
           u'SHIFT'],
          [u'EXIT',
           u'LOC',
           u'LEFT',
           u'RIGHT',
           u'ALL',
           u'CLR',
           u'SPACE',
           u'|',
           u'\\',
           u'\xb5']], [[u'\xb0',
           u'!',
           u'"',
           u'\xa7',
           u'$',
           u'%',
           u'&',
           u'/',
           u'(',
           u')',
           u'=',
           u'?',
           u'`',
           u'BACKSPACE'],
          [u'FIRST',
           u'Q',
           u'W',
           u'E',
           u'R',
           u'T',
           u'Z',
           u'U',
           u'I',
           u'O',
           u'P',
           u'\xdc',
           u'{',
           u'}'],
          [u'LAST',
           u'A',
           u'S',
           u'D',
           u'F',
           u'G',
           u'H',
           u'J',
           u'K',
           u'L',
           u'\xd6',
           u'\xc4',
           u'*',
           u'ENTER'],
          [u'SHIFT',
           u'>',
           u'Y',
           u'X',
           u'C',
           u'V',
           u'B',
           u'N',
           u'M',
           u';',
           u':',
           u'_',
           u'@',
           u'SHIFT'],
          [u'EXIT',
           u'LOC',
           u'LEFT',
           u'RIGHT',
           u'ALL',
           u'CLR',
           u'SPACE',
           u'\u20ac',
           u'\xb2',
           u'\xb3']]]
        self.russian = [[[u'\u0451',
           u'1',
           u'2',
           u'3',
           u'4',
           u'5',
           u'6',
           u'7',
           u'8',
           u'9',
           u'0',
           u'-',
           u'=',
           u'BACKSPACE'],
          [u'FIRST',
           u'\u0439',
           u'\u0446',
           u'\u0443',
           u'\u043a',
           u'\u0435',
           u'\u043d',
           u'\u0433',
           u'\u0448',
           u'\u0449',
           u'\u0437',
           u'\u0445',
           u'\u044a',
           u'\xa7'],
          [u'LAST',
           u'\u0444',
           u'\u044b',
           u'\u0432',
           u'\u0430',
           u'\u043f',
           u'\u0440',
           u'\u043e',
           u'\u043b',
           u'\u0434',
           u'\u0436',
           u'\u044d',
           u'\\',
           u'ENTER'],
          [u'SHIFT',
           u'\u044f',
           u'\u0447',
           u'\u0441',
           u'\u043c',
           u'\u0438',
           u'\u0442',
           u'\u044c',
           u'\u0431',
           u'\u044e',
           u'.',
           u'@',
           u'&',
           u'SHIFT'],
          [u'EXIT',
           u'LOC',
           u'LEFT',
           u'RIGHT',
           u'ALL',
           u'CLR',
           u'SPACE',
           u'<']], [[u'\u0401',
           u'!',
           u'"',
           u'\u2116',
           u';',
           u'%',
           u':',
           u'?',
           u'*',
           u'(',
           u')',
           u'_',
           u'+',
           u'BACKSPACE'],
          [u'FIRST',
           u'\u0419',
           u'\u0426',
           u'\u0423',
           u'\u041a',
           u'\u0415',
           u'\u041d',
           u'\u0413',
           u'\u0428',
           u'\u0429',
           u'\u0417',
           u'\u0425',
           u'\u042a',
           u'\u20bd'],
          [u'LAST',
           u'\u0424',
           u'\u042b',
           u'\u0412',
           u'\u0410',
           u'\u041f',
           u'\u0420',
           u'\u041e',
           u'\u041b',
           u'\u0414',
           u'\u0416',
           u'\u042d',
           u'/',
           u'ENTER'],
          [u'SHIFT',
           u'\u042f',
           u'\u0427',
           u'\u0421',
           u'\u041c',
           u'\u0418',
           u'\u0422',
           u'\u042c',
           u'\u0411',
           u'\u042e',
           u',',
           u'#',
           u'$',
           u'SHIFT'],
          [u'EXIT',
           u'LOC',
           u'LEFT',
           u'RIGHT',
           u'ALL',
           u'CLR',
           u'SPACE',
           u'>']]]
        self.scandinavian = [[[u'\xa7',
           u'1',
           u'2',
           u'3',
           u'4',
           u'5',
           u'6',
           u'7',
           u'8',
           u'9',
           u'0',
           u'+',
           u'@',
           u'BACKSPACE'],
          [u'FIRST',
           u'q',
           u'w',
           u'e',
           u'r',
           u't',
           u'y',
           u'u',
           u'i',
           u'o',
           u'p',
           u'\xe5',
           u'[',
           u']'],
          [u'LAST',
           u'a',
           u's',
           u'd',
           u'f',
           u'g',
           u'h',
           u'j',
           u'k',
           u'l',
           u'\xf6',
           u'\xe4',
           u"'",
           u'ENTER'],
          [u'SHIFT',
           u'<',
           u'z',
           u'x',
           u'c',
           u'v',
           u'b',
           u'n',
           u'm',
           u',',
           '.',
           u'-',
           u'\xab',
           u'SHIFT'],
          [u'EXIT',
           u'LOC',
           u'LEFT',
           u'RIGHT',
           u'ALL',
           u'CLR',
           u'SPACE']], [[u'\xbd',
           u'!',
           u'"',
           u'#',
           u'\xa4',
           u'%',
           u'&',
           u'/',
           u'(',
           u')',
           u'=',
           u'?',
           u'|',
           u'BACKSPACE'],
          [u'FIRST',
           u'Q',
           u'W',
           u'E',
           u'R',
           u'T',
           u'Y',
           u'U',
           u'I',
           u'O',
           u'P',
           u'\xc5',
           u'{',
           u'}'],
          [u'LAST',
           u'A',
           u'S',
           u'D',
           u'F',
           u'G',
           u'H',
           u'J',
           u'K',
           u'L',
           u'\xd6',
           u'\xc4',
           u'*',
           u'ENTER'],
          [u'SHIFT',
           u'>',
           u'Z',
           u'X',
           u'C',
           u'V',
           u'B',
           u'N',
           u'M',
           u';',
           u':',
           u'_',
           u'\xbb',
           u'SHIFT'],
          [u'EXIT',
           u'LOC',
           u'LEFT',
           u'RIGHT',
           u'ALL',
           u'CLR',
           u'SPACE']], [[u'',
           u'\xe2',
           u'\xea',
           u'\xee',
           u'\xf4',
           u'\xfb',
           u'\xe4',
           u'\xeb',
           u'\xef',
           u'\xf6',
           u'\xfc',
           u'\xe3',
           u'\xf5',
           u'BACKSPACE'],
          [u'FIRST',
           u'\xe0',
           u'\xe8',
           u'\xec',
           u'\xf2',
           u'\xf9',
           u'\xe1',
           u'\xe9',
           u'\xed',
           u'\xf3',
           u'\xfa',
           u'',
           u'',
           u''],
          [u'LAST',
           u'\xc2',
           u'\xca',
           u'\xce',
           u'\xd4',
           u'\xdb',
           u'\xc4',
           u'\xcb',
           u'\xcf',
           u'\xd6',
           u'\xdc',
           u'\xc3',
           u'\xd5',
           u'ENTER'],
          [u'SHIFT',
           u'\xc0',
           u'\xc8',
           u'\xcc',
           u'\xd2',
           u'\xd9',
           u'\xc1',
           u'\xc9',
           u'\xcd',
           u'\xd3',
           u'\xda',
           u'',
           u'',
           u'SHIFT'],
          [u'EXIT',
           u'LOC',
           u'LEFT',
           u'RIGHT',
           u'ALL',
           u'CLR',
           u'SPACE']]]
        self.spanish = [[[u'\\',
           u'1',
           u'2',
           u'3',
           u'4',
           u'5',
           u'6',
           u'7',
           u'8',
           u'9',
           u'0',
           u"'",
           u'\xa1',
           u'BACKSPACE'],
          [u'FIRST',
           u'q',
           u'w',
           u'e',
           u'r',
           u't',
           u'y',
           u'u',
           u'i',
           u'o',
           u'p',
           u'@',
           u'+',
           u'\xe7'],
          [u'LAST',
           u'a',
           u's',
           u'd',
           u'f',
           u'g',
           u'h',
           u'j',
           u'k',
           u'l',
           u'\xf1',
           u'[',
           u']',
           u'ENTER'],
          [u'SHIFT',
           u'<',
           u'z',
           u'x',
           u'c',
           u'v',
           u'b',
           u'n',
           u'm',
           u',',
           '.',
           u'-',
           u'\u20ac',
           u'SHIFT'],
          [u'EXIT',
           u'LOC',
           u'LEFT',
           u'RIGHT',
           u'ALL',
           u'CLR',
           u'SPACE',
           u'',
           u'\xe1',
           u'\xe9',
           u'\xed',
           u'\xf3',
           u'\xfa',
           u'\xfc']], [[u'|',
           u'!',
           u'"',
           u'\xb7',
           u'$',
           u'%',
           u'&',
           u'/',
           u'(',
           u')',
           u'=',
           u'?',
           u'\xbf',
           u'BACKSPACE'],
          [u'FIRST',
           u'Q',
           u'W',
           u'E',
           u'R',
           u'T',
           u'Y',
           u'U',
           u'I',
           u'O',
           u'P',
           u'#',
           u'*',
           u'\xc7'],
          [u'LAST',
           u'A',
           u'S',
           u'D',
           u'F',
           u'G',
           u'H',
           u'J',
           u'K',
           u'L',
           u'\xd1',
           u'{',
           u'}',
           u'ENTER'],
          [u'SHIFT',
           u'>',
           u'Z',
           u'X',
           u'C',
           u'V',
           u'B',
           u'N',
           u'M',
           u';',
           u':',
           u'_',
           u'\xac',
           u'SHIFT'],
          [u'EXIT',
           u'LOC',
           u'LEFT',
           u'RIGHT',
           u'ALL',
           u'CLR',
           u'SPACE',
           u'',
           u'\xc1',
           u'\xc9',
           u'\xcd',
           u'\xd3',
           u'\xda',
           u'\xdc']]]
        self.locales = {'ar_BH': [_('Arabic'), _('Bahrain'), self.arabic(self.english)],
         'ar_EG': [_('Arabic'), _('Egypt'), self.arabic(self.english)],
         'ar_JO': [_('Arabic'), _('Jordan'), self.arabic(self.english)],
         'ar_KW': [_('Arabic'), _('Kuwait'), self.arabic(self.english)],
         'ar_LB': [_('Arabic'), _('Lebanon'), self.arabic(self.english)],
         'ar_OM': [_('Arabic'), _('Oman'), self.arabic(self.english)],
         'ar_QA': [_('Arabic'), _('Qatar'), self.arabic(self.english)],
         'ar_SA': [_('Arabic'), _('Saudi Arabia'), self.arabic(self.english)],
         'ar_SY': [_('Arabic'), _('Syrian Arab Republic'), self.arabic(self.english)],
         'ar_AE': [_('Arabic'), _('United Arab Emirates'), self.arabic(self.english)],
         'ar_YE': [_('Arabic'), _('Yemen'), self.arabic(self.english)],
         'cs_CZ': [_('Czech'), _('Czechia'), [[[u';',
                      u'+',
                      u'\u011b',
                      u'\u0161',
                      u'\u010d',
                      u'\u0159',
                      u'\u017e',
                      u'\xfd',
                      u'\xe1',
                      u'\xed',
                      u'\xe9',
                      u'=',
                      u'',
                      u'BACKSPACE'],
                     [u'FIRST',
                      u'q',
                      u'w',
                      u'e',
                      u'r',
                      u't',
                      u'z',
                      u'u',
                      u'i',
                      u'o',
                      u'p',
                      u'\xfa',
                      u')',
                      u''],
                     [u'LAST',
                      u'a',
                      u's',
                      u'd',
                      u'f',
                      u'g',
                      u'h',
                      u'j',
                      u'k',
                      u'l',
                      u'\u016f',
                      u'\xa7',
                      u'',
                      u'ENTER'],
                     [u'SHIFT',
                      u'y',
                      u'x',
                      u'c',
                      u'v',
                      u'b',
                      u'n',
                      u'm',
                      u',',
                      '.',
                      u'-',
                      u'\u0148',
                      u'',
                      u'SHIFT'],
                     [u'EXIT',
                      u'LOC',
                      u'LEFT',
                      u'RIGHT',
                      u'ALL',
                      u'CLR',
                      u'SPACE']], [[u'',
                      u'1',
                      u'2',
                      u'3',
                      u'4',
                      u'5',
                      u'6',
                      u'7',
                      u'8',
                      u'9',
                      u'0',
                      u'%',
                      u'',
                      u'BACKSPACE'],
                     [u'FIRST',
                      u'Q',
                      u'W',
                      u'E',
                      u'R',
                      u'T',
                      u'Z',
                      u'U',
                      u'I',
                      u'O',
                      u'P',
                      u'/',
                      u'(',
                      u''],
                     [u'LAST',
                      u'A',
                      u'S',
                      u'D',
                      u'F',
                      u'G',
                      u'H',
                      u'J',
                      u'K',
                      u'L',
                      u'"',
                      u'!',
                      u"'",
                      u'ENTER'],
                     [u'SHIFT',
                      u'Y',
                      u'X',
                      u'C',
                      u'V',
                      u'B',
                      u'N',
                      u'M',
                      u'?',
                      u':',
                      u'_',
                      u'\u0147',
                      u'',
                      u'SHIFT'],
                     [u'EXIT',
                      u'LOC',
                      u'LEFT',
                      u'RIGHT',
                      u'ALL',
                      u'CLR',
                      u'SPACE']], [[u'',
                      u'~',
                      u'\u011a',
                      u'\u0160',
                      u'\u010c',
                      u'\u0158',
                      u'\u017d',
                      u'\xdd',
                      u'\xc1',
                      u'\xcd',
                      u'\xc9',
                      u'`',
                      u'',
                      u'BACKSPACE'],
                     [u'FIRST',
                      u'\\',
                      u'|',
                      u'\u20ac',
                      u'\u0165',
                      u'\u0164',
                      u'',
                      u'',
                      u'',
                      u'\xf3',
                      u'\xd3',
                      u'\xda',
                      u'\xf7',
                      u'\xd7'],
                     [u'LAST',
                      u'',
                      u'\u0111',
                      u'\xd0',
                      u'[',
                      u']',
                      u'\u010f',
                      u'\u010e',
                      u'\u0142',
                      u'\u0141',
                      u'\u016e',
                      u'$',
                      u'\xdf',
                      u'ENTER'],
                     [u'SHIFT',
                      u'',
                      u'#',
                      u'&',
                      u'@',
                      u'{',
                      u'}',
                      u'',
                      u'<',
                      u'>',
                      u'*',
                      u'',
                      u'\xa4',
                      u'SHIFT'],
                     [u'EXIT',
                      u'LOC',
                      u'LEFT',
                      u'RIGHT',
                      u'ALL',
                      u'CLR',
                      u'SPACE']]]],
         'nl_NL': [_('Dutch'), _('Netherlands'), self.dutch(self.english)],
         'en_AU': [_('English'), _('Australian'), self.australian(self.english)],
         'en_GB': [_('English'), _('United Kingdom'), self.unitedKingdom(self.english)],
         'en_US': [_('English'), _('United States'), self.english],
         'en_EN': [_('English'), _('Various'), self.english],
         'et_EE': [_('Estonian'), _('Estonia'), self.estonian(self.scandinavian)],
         'fi_FI': [_('Finnish'), _('Finland'), self.finnish(self.scandinavian)],
         'fr_BE': [_('French'), _('Belgian'), self.belgian(self.french)],
         'fr_FR': [_('French'), _('France'), self.french],
         'de_DE': [_('German'), _('Germany'), self.german],
         'el_GR': [_('Greek (Modern)'), _('Greece'), [[[u'`',
                      u'1',
                      u'2',
                      u'3',
                      u'4',
                      u'5',
                      u'6',
                      u'7',
                      u'8',
                      u'9',
                      u'0',
                      u'-',
                      u'=',
                      u'BACKSPACE'],
                     [u'FIRST',
                      u';',
                      u'\u03c2',
                      u'\u03b5',
                      u'\u03c1',
                      u'\u03c4',
                      u'\u03c5',
                      u'\u03b8',
                      u'\u03b9',
                      u'\u03bf',
                      u'\u03c0',
                      u'[',
                      u']',
                      u'/'],
                     [u'LAST',
                      u'\u03b1',
                      u'\u03c3',
                      u'\u03b4',
                      u'\u03c6',
                      u'\u03b3',
                      u'\u03b7',
                      u'\u03be',
                      u'\u03ba',
                      u'\u03bb',
                      u'',
                      u"'",
                      u'\\',
                      u'ENTER'],
                     [u'SHIFT',
                      u'<',
                      u'\u03b6',
                      u'\u03c7',
                      u'\u03c8',
                      u'\u03c9',
                      u'\u03b2',
                      u'\u03bd',
                      u'\u03bc',
                      u',',
                      '.',
                      u'\u03ca',
                      u'\u03cb',
                      u'SHIFT'],
                     [u'EXIT',
                      u'LOC',
                      u'LEFT',
                      u'RIGHT',
                      u'ALL',
                      u'CLR',
                      u'SPACE',
                      u'\u03ac',
                      u'\u03ad',
                      u'\u03ae',
                      u'\u03af',
                      u'\u03cc',
                      u'\u03cd',
                      u'\u03ce']], [[u'~',
                      u'!',
                      u'@',
                      u'#',
                      u'$',
                      u'%',
                      u'^',
                      u'&',
                      u'*',
                      u'(',
                      u')',
                      u'_',
                      u'+',
                      u'BACKSPACE'],
                     [u'FIRST',
                      u':',
                      u'',
                      u'\u0395',
                      u'\u03a1',
                      u'\u03a4',
                      u'\u03a5',
                      u'\u0398',
                      u'\u0399',
                      u'\u039f',
                      u'\u03a0',
                      u'{',
                      u'}',
                      u'?'],
                     [u'LAST',
                      u'\u0391',
                      u'\u03a3',
                      u'\u0394',
                      u'\u03a6',
                      u'\u0393',
                      u'\u0397',
                      u'\u039e',
                      u'\u039a',
                      u'\u039b',
                      u'',
                      u'"',
                      u'|',
                      u'ENTER'],
                     [u'SHIFT',
                      u'>',
                      u'\u0396',
                      u'\u03a7',
                      u'\u03a8',
                      u'\u03a9',
                      u'\u0392',
                      u'\u039d',
                      u'\u039c',
                      u'<',
                      u'>',
                      u'\u03aa',
                      u'\u03ab',
                      u'SHIFT'],
                     [u'EXIT',
                      u'LOC',
                      u'LEFT',
                      u'RIGHT',
                      u'ALL',
                      u'CLR',
                      u'SPACE',
                      u'\u0386',
                      u'\u0388',
                      u'\u0389',
                      u'\u038a',
                      u'\u038c',
                      u'\u038e',
                      u'\u038f']], [[u'',
                      u'',
                      u'\xb2',
                      u'\xb3',
                      u'\xa3',
                      u'\xa7',
                      u'\xb6',
                      u'\u20ac',
                      u'\xa4',
                      u'\xa6',
                      u'\xb0',
                      u'\xb1',
                      u'\xbd',
                      u'BACKSPACE'],
                     [u'FIRST',
                      u'',
                      u'',
                      u'',
                      u'',
                      u'',
                      u'',
                      u'',
                      u'',
                      u'',
                      u'',
                      u'',
                      u'',
                      u''],
                     [u'LAST',
                      u'',
                      u'',
                      u'',
                      u'',
                      u'',
                      u'',
                      u'',
                      u'',
                      u'',
                      u'',
                      u'',
                      u'',
                      u'ENTER'],
                     [u'SHIFT',
                      u'',
                      u'',
                      u'',
                      u'',
                      u'',
                      u'',
                      u'',
                      u'',
                      u'',
                      u'',
                      u'',
                      u'',
                      u'SHIFT'],
                     [u'EXIT',
                      u'LOC',
                      u'LEFT',
                      u'RIGHT',
                      u'ALL',
                      u'CLR',
                      u'SPACE']]]],
         'lv_LV': [_('Latvian'), _('Latvia'), self.latvian(self.english)],
         'lt_LT': [_('Lithuanian'), _('Lithuania'), self.lithuanian(self.english)],
         'nb_NO': [_('Norwegian'), _('Norway'), self.norwegian(self.scandinavian)],
         'fa_IR': [_('Persian'), _('Iran, Islamic Republic'), self.persian(self.english)],
         'pl_PL': [_('Polish'), _('Poland'), self.polish(self.english)],
         'ru_RU': [_('Russian'), _('Russian Federation'), self.russian],
         'sk_SK': [_('Slovak'), _('Slovakia'), [[[u'~',
                      u'!',
                      u'@',
                      u'#',
                      u'$',
                      u'%',
                      u'^',
                      u'&',
                      u'*',
                      u'(',
                      u')',
                      u'\xe1',
                      u'\xe4',
                      u'BACKSPACE'],
                     [u'FIRST',
                      u'q',
                      u'w',
                      u'e',
                      u'r',
                      u't',
                      u'y',
                      u'u',
                      u'i',
                      u'o',
                      u'p',
                      u'\u010d',
                      u'\u010f',
                      u'\xe9'],
                     [u'LAST',
                      u'a',
                      u's',
                      u'd',
                      u'f',
                      u'g',
                      u'h',
                      u'j',
                      u'k',
                      u'l',
                      u'\xed',
                      u'\u013a',
                      u'\u013e',
                      u'ENTER'],
                     [u'SHIFT',
                      u'<',
                      u'z',
                      u'x',
                      u'c',
                      u'v',
                      u'b',
                      u'n',
                      u'm',
                      u',',
                      '.',
                      u'\u0148',
                      u'\xf3',
                      u'SHIFT'],
                     [u'EXIT',
                      u'LOC',
                      u'LEFT',
                      u'RIGHT',
                      u'ALL',
                      u'CLR',
                      u'SPACE',
                      u'\xf4',
                      u'\u0155',
                      u'\u0161',
                      u'\u0165',
                      u'\xfa',
                      u'\xfd',
                      u'\u017e']], [[u'`',
                      u'1',
                      u'2',
                      u'3',
                      u'4',
                      u'5',
                      u'6',
                      u'7',
                      u'8',
                      u'9',
                      u'0',
                      u'\xc1',
                      u'\xc4',
                      u'BACKSPACE'],
                     [u'FIRST',
                      u'Q',
                      u'W',
                      u'E',
                      u'R',
                      u'T',
                      u'Y',
                      u'U',
                      u'I',
                      u'O',
                      u'P',
                      u'\u010c',
                      u'\u010e',
                      u'\xc9'],
                     [u'LAST',
                      u'A',
                      u'S',
                      u'D',
                      u'F',
                      u'G',
                      u'H',
                      u'J',
                      u'K',
                      u'L',
                      u'\xcd',
                      u'\u0139',
                      u'\u013d',
                      u'ENTER'],
                     [u'SHIFT',
                      u'>',
                      u'Z',
                      u'X',
                      u'C',
                      u'V',
                      u'B',
                      u'N',
                      u'M',
                      u'?',
                      u':',
                      u'\u0147',
                      u'\xd3',
                      u'SHIFT'],
                     [u'EXIT',
                      u'LOC',
                      u'LEFT',
                      u'RIGHT',
                      u'ALL',
                      u'CLR',
                      u'SPACE',
                      u'\xd4',
                      u'\u0154',
                      u'\u0160',
                      u'\u0164',
                      u'\xda',
                      u'\xdd',
                      u'\u017d']], [[u'',
                      u'',
                      u'\xa7',
                      u'\xb0',
                      u'\xa4',
                      u'\u20ac',
                      u'\xdf',
                      u'\u0111',
                      u'\u0110',
                      u'\u0142',
                      u'\u0141',
                      u'',
                      u'',
                      u'BACKSPACE'],
                     [u'FIRST',
                      u'',
                      u'',
                      u"'",
                      u'"',
                      u'+',
                      u'-',
                      u'\xd7',
                      u'\xf7',
                      u'=',
                      u'_',
                      u'~',
                      u'',
                      u''],
                     [u'LAST',
                      u'',
                      u'',
                      u'/',
                      u'\\',
                      u';',
                      u'[',
                      u']',
                      u'{',
                      u'}',
                      u'|',
                      u'',
                      u'',
                      u'ENTER'],
                     [u'SHIFT',
                      u'',
                      u'',
                      u'',
                      u'',
                      u'',
                      u'',
                      u'',
                      u'',
                      u'',
                      u'',
                      u'',
                      u'',
                      u'SHIFT'],
                     [u'EXIT',
                      u'LOC',
                      u'LEFT',
                      u'RIGHT',
                      u'ALL',
                      u'CLR',
                      u'SPACE']]]],
         'es_ES': [_('Spanish'), _('Spain'), self.spanish],
         'sv_SE': [_('Swedish'), _('Sweden'), self.swedish(self.scandinavian)],
         'th_TH': [_('Thai'), _('Thailand'), [[[u'',
                      u'',
                      u'\u0e45',
                      u'\u0e20',
                      u'\u0e16',
                      u'\u0e38',
                      u'\u0e36',
                      u'\u0e04',
                      u'\u0e15',
                      u'\u0e08',
                      u'\u0e02',
                      u'\u0e0a',
                      u'',
                      u'BACKSPACE'],
                     [u'FIRST',
                      u'\u0e46',
                      u'\u0e44',
                      u'\u0e33',
                      u'\u0e1e',
                      u'\u0e30',
                      u'\u0e31',
                      u'\u0e35',
                      u'\u0e23',
                      u'\u0e19',
                      u'\u0e22',
                      u'\u0e1a',
                      u'\u0e25',
                      u''],
                     [u'LAST',
                      u'\u0e1f',
                      u'\u0e2b',
                      u'\u0e01',
                      u'\u0e14',
                      u'\u0e40',
                      u'\u0e49',
                      u'\u0e48',
                      u'\u0e32',
                      u'\u0e2a',
                      u'\u0e27',
                      u'\u0e07',
                      u'\u0e03',
                      u'OK'],
                     [u'SHIFT',
                      u'\u0e1c',
                      u'\u0e1b',
                      u'\u0e41',
                      u'\u0e2d',
                      u'\u0e34',
                      u'\u0e37',
                      u'\u0e17',
                      u'\u0e21',
                      u'\u0e43',
                      u'\u0e1d',
                      u'',
                      u'',
                      u'SHIFT'],
                     [u'EXIT',
                      u'LOC',
                      u'LEFT',
                      u'RIGHT',
                      u'ALL',
                      u'CLR',
                      u'SPACE']], [[u'',
                      u'',
                      u'\u0e51',
                      u'\u0e52',
                      u'\u0e53',
                      u'\u0e54',
                      u'\u0e39',
                      u'\u0e55',
                      u'\u0e56',
                      u'\u0e57',
                      u'\u0e58',
                      u'\u0e59',
                      u'',
                      u'BACKSPACE'],
                     [u'FIRST',
                      u'\u0e50',
                      u'',
                      u'\u0e0e',
                      u'\u0e11',
                      u'\u0e18',
                      u'\u0e4d',
                      u'\u0e4a',
                      u'\u0e13',
                      u'\u0e2f',
                      u'\u0e0d',
                      u'\u0e10',
                      u'\u0e05',
                      u''],
                     [u'LAST',
                      u'\u0e24',
                      u'\u0e06',
                      u'\u0e0f',
                      u'\u0e42',
                      u'\u0e0c',
                      u'\u0e47',
                      u'\u0e4b',
                      u'\u0e29',
                      u'\u0e28',
                      u'\u0e0b',
                      u'',
                      u'\u0e3f',
                      u'OK'],
                     [u'SHIFT',
                      u'',
                      u'',
                      u'\u0e09',
                      u'\u0e2e',
                      u'\u0e3a',
                      u'\u0e4c',
                      u'',
                      u'\u0e12',
                      u'\u0e2c',
                      u'\u0e26',
                      u'',
                      u'',
                      u'SHIFT'],
                     [u'EXIT',
                      u'LOC',
                      u'LEFT',
                      u'RIGHT',
                      u'ALL',
                      u'CLR',
                      u'SPACE']]]],
         'uk_UA': [_('Ukrainian'), _('Ukraine'), self.ukranian(self.russian)]}
        self.oldaction()
        self.lang = language.getLanguage()
        self['prompt'] = Label(prompt)
        self['text'] = Input(text=self.text, maxSize=self.maxSize, visible_width=self.visible_width, type=self.type, currPos=len(self.text), allMarked=self.allMarked)
        self['list'] = VirtualKeyBoardList([])
        self['mode'] = Label(_('INS'))
        self['locale'] = Label(_('Locale') + ': ' + self.lang)
        self['language'] = Label(_('Language') + ': ' + self.lang)
        self['key_info'] = StaticText(_('INFO'))
        self['key_red'] = StaticText(_('Exit'))
        self['key_green'] = StaticText(_('Save'))
        self['key_yellow'] = StaticText(_('Select locale'))
        self['key_blue'] = StaticText(self.shiftMsgs[1])
        self['key_help'] = StaticText(_('HELP'))
        width, self.height = skin.parameters.get('VirtualKeyBoard', (45, 45))
        self.width = self.key_bg and self.key_bg.size().width() or width
        self.shiftColors = skin.parameters.get('VirtualKeyBoardShiftColors', (16777215, 16777215, 65535, 16711935))
        self.language = None
        self.location = None
        self.keyList = []
        self.shiftLevels = 0
        self.shiftLevel = 0
        self.keyboardWidth = 0
        self.keyboardHeight = 0
        self.maxKey = 0
        self.overwrite = False
        self.selectedKey = None
        self.sms = NumericalTextInput(self.smsGotChar)
        self.smsChar = None
        self.setLocale()
        self.onExecBegin.append(self.setKeyboardModeAscii)
        self.onLayoutFinish.append(self.buildVirtualKeyBoard)

    def arabic(self, base):
        keyList = copy.deepcopy(base)
        keyList[1][0][8] = u'\u066d'
        keyList.extend([[[u'\u0630',
           u'\u0661',
           u'\u0662',
           u'\u0663',
           u'\u0664',
           u'\u0665',
           u'\u0666',
           u'\u0667',
           u'\u0668',
           u'\u0669',
           u'\u0660',
           u'-',
           u'=',
           u'BACKSPACE'],
          [u'FIRST',
           u'\u0636',
           u'\u0635',
           u'\u062b',
           u'\u0642',
           u'\u0641',
           u'\u063a',
           u'\u0639',
           u'\u0647',
           u'\u062e',
           u'\u062d',
           u'\u062c',
           u'\u062f',
           u'\\'],
          [u'LAST',
           u'\u0634',
           u'\u0633',
           u'\u064a',
           u'\u0628',
           u'\u0644',
           u'\u0627',
           u'\u062a',
           u'\u0646',
           u'\u0645',
           u'\u0643',
           u'\u0637',
           u'',
           u'ENTER'],
          [u'SHIFT',
           u'\u0626',
           u'\u0621',
           u'\u0624',
           u'\u0631',
           u'\ufefb',
           u'\u0649',
           u'\u0629',
           u'\u0648',
           u'\u0632',
           u'\u0638',
           u'',
           u'',
           u'SHIFT'],
          [u'EXIT',
           u'LOC',
           u'LEFT',
           u'RIGHT',
           u'ALL',
           u'CLR',
           u'SPACE']], [[u'\u0651',
           u'!',
           u'@',
           u'#',
           u'$',
           u'%',
           u'^',
           u'&',
           u'\u066d',
           u'(',
           u')',
           u'_',
           u'+',
           u'BACKSPACE'],
          [u'FIRST',
           u'\u0636',
           u'\u0635',
           u'\u062b',
           u'\u0642',
           u'\u0641',
           u'\u063a',
           u'\u0639',
           u'\xf7',
           u'\xd7',
           u'\u061b',
           u'>',
           u'<',
           u'|'],
          [u'LAST',
           u'\u0634',
           u'\u0633',
           u'\u064a',
           u'\u0628',
           u'\u0644',
           u'\u0623',
           u'\u0640',
           u'\u060c',
           u'/',
           u':',
           u'"',
           u'',
           u'ENTER'],
          [u'SHIFT',
           u'\u0626',
           u'\u0621',
           u'\u0624',
           u'\u0631',
           u'\ufef5',
           u'\u0622',
           u'\u0629',
           u',',
           u'.',
           u'\u061f',
           u'',
           u'',
           u'SHIFT'],
          [u'EXIT',
           u'LOC',
           u'LEFT',
           u'RIGHT',
           u'ALL',
           u'CLR',
           u'SPACE']]])
        return keyList

    def australian(self, base):
        keyList = copy.deepcopy(base)
        keyList[0][-1].extend([u'www.',
         u'.com',
         u'.net',
         u'.org',
         u'.edu',
         u'.au',
         u'.tv'])
        keyList[1][-1].extend([u'www.',
         u'.com',
         u'.net',
         u'.org',
         u'.edu',
         u'.au',
         u'.tv'])
        return keyList

    def belgian(self, base):
        keyList = copy.deepcopy(base)
        keyList[0][0][6] = u'\xa7'
        keyList[0][0][8] = u'!'
        keyList[0][0][12] = u'-'
        keyList[0][2][12] = u'\xb5'
        keyList[0][3][11] = u'='
        keyList[1][0][0] = u'\xb3'
        keyList[1][0][12] = u'_'
        keyList[1][1][11] = u'*'
        keyList[1][2][12] = u'\xa3'
        keyList[1][3][11] = u'+'
        return keyList

    def dutch(self, base):
        keyList = copy.deepcopy(base)
        keyList[0][0][0] = u'@'
        keyList[0][0][11] = u'/'
        keyList[0][0][12] = u'\xba'
        keyList[0][1][11] = u'\xa8'
        keyList[0][1][12] = u'*'
        keyList[0][1][13] = u'<'
        keyList[0][2][10] = u'+'
        keyList[0][2][11] = u'\xb4'
        keyList[0][2][12] = u'\\'
        keyList[0][3] = [u'SHIFT',
         u']',
         u'z',
         u'x',
         u'c',
         u'v',
         u'b',
         u'n',
         u'm',
         u',',
         u'.',
         u'-',
         u'{',
         u'SHIFT']
        keyList[1][0] = [u'\xa7',
         u'!',
         u'"',
         u'#',
         u'$',
         u'%',
         u'&',
         u'_',
         u'(',
         u')',
         u"'",
         u'?',
         u'~',
         u'BACKSPACE']
        keyList[1][1][11] = u'^'
        keyList[1][1][12] = u'|'
        keyList[1][1][13] = u'>'
        keyList[1][2][10] = u'\xb1'
        keyList[1][2][11] = u'`'
        keyList[1][2][12] = u'\xa6'
        keyList[1][3] = [u'SHIFT',
         u'[',
         u'Z',
         u'X',
         u'C',
         u'V',
         u'B',
         u'N',
         u'M',
         u';',
         u':',
         u'=',
         u'}',
         u'SHIFT']
        keyList.append([[u'\xac',
          u'\xb9',
          u'\xb2',
          u'\xb3',
          u'\xbc',
          u'\xbd',
          u'\xbe',
          u'\xa3',
          u'{',
          u'}',
          u'$',
          u'\\',
          u'',
          u'BACKSPACE'],
         [u'FIRST',
          u'',
          u'',
          u'\u20ac',
          u'\xb6',
          u'',
          u'',
          u'',
          u'',
          u'',
          u'',
          u'',
          u'',
          u''],
         [u'LAST',
          u'',
          u'',
          u'',
          u'',
          u'',
          u'',
          u'',
          u'',
          u'',
          u'',
          u'',
          u'',
          u'ENTER'],
         [u'SHIFT',
          u'\xa6',
          u'\xab',
          u'\xbb',
          u'\xa2',
          u'',
          u'',
          u'',
          u'\xb5',
          u'',
          u'\xb7',
          u'',
          u'',
          u'SHIFT'],
         [u'EXIT',
          u'LOC',
          u'LEFT',
          u'RIGHT',
          u'ALL',
          u'CLR',
          u'SPACE']])
        return keyList

    def oldaction(self):
        self['actions'] = NumberActionMap(['OkCancelActions',
         'WizardActions',
         'ColorActions',
         'KeyboardInputActions',
         'InputBoxActions',
         'InputAsciiActions',
         'VirtualKeyBoardActions',
         'HelpableNumberActionMap'], {'gotAsciiCode': self.keyGotAscii,
         'ok': self.okClicked,
         'cancel': self.cancel,
         'left': self.left,
         'right': self.right,
         'up': self.up,
         'down': self.down,
         'red': self.cancel,
         'green': self.save,
         'yellow': self.localeMenu,
         'blue': self.shiftClicked,
         'deleteBackward': self.backClicked,
         'deleteForward': self.forwardClicked,
         'back': self.close,
         'pageUp': self.cursorRight,
         'pageDown': self.cursorLeft,
         '1': self.keyNumberGlobal,
         '2': self.keyNumberGlobal,
         '3': self.keyNumberGlobal,
         '4': self.keyNumberGlobal,
         '5': self.keyNumberGlobal,
         '6': self.keyNumberGlobal,
         '7': self.keyNumberGlobal,
         '8': self.keyNumberGlobal,
         '9': self.keyNumberGlobal,
         '0': self.keyNumberGlobal}, -2)

    def estonian(self, base):
        keyList = copy.deepcopy(base)
        keyList[0][1][11] = u'\xfc'
        keyList[0][1][12] = u'\xf5'
        keyList[0][1][13] = u'\u0161'
        keyList[0][3][12] = u'\u017e'
        keyList[0][4].extend([u'[', u']', u'\\'])
        keyList[1][1][11] = u'\xdc'
        keyList[1][1][12] = u'\xd5'
        keyList[1][1][13] = u'\u0160'
        keyList[1][3][12] = u'\u017d'
        keyList[1][4].extend([u'{',
         u'}',
         u'\xa3',
         u'$',
         u'\u20ac'])
        del keyList[2]
        return keyList

    def finnish(self, base):
        keyList = copy.deepcopy(base)
        keyList[0][4].append(u'\\')
        keyList[1][4].extend([u'\xa3', u'$', u'\u20ac'])
        return keyList

    def latvian(self, base):
        keyList = copy.deepcopy(base)
        keyList.append([[u'',
          u'',
          u'',
          u'',
          u'',
          u'',
          u'',
          u'',
          u'',
          u'',
          u'',
          u'',
          u'',
          u'BACKSPACE'],
         [u'FIRST',
          u'',
          u'\u0113',
          u'\u0112',
          u'\u0157',
          u'\u0156',
          u'\u016b',
          u'\u016a',
          u'\u012b',
          u'\u012a',
          u'\u014d',
          u'\u014c',
          u'',
          u''],
         [u'LAST',
          u'\u0101',
          u'\u0100',
          u'\u0161',
          u'\u0160',
          u'\u0123',
          u'\u0122',
          u'\u0137',
          u'\u0136',
          u'\u013c',
          u'\u013b',
          u'',
          u'',
          u'ENTER'],
         [u'SHIFT',
          u'\u017e',
          u'\u017d',
          u'\u010d',
          u'\u010c',
          u'',
          u'\u0146',
          u'\u0145',
          u'',
          u'',
          u'',
          u'',
          u'',
          u'SHIFT'],
         [u'EXIT',
          u'LOC',
          u'LEFT',
          u'RIGHT',
          u'ALL',
          u'CLR',
          u'SPACE']])
        return keyList

    def lithuanian(self, base):
        keyList = copy.deepcopy(base)
        keyList[0][0] = [u'`',
         u'\u0105',
         u'\u010d',
         u'\u0119',
         u'\u0117',
         u'\u012f',
         u'\u0161',
         u'\u0173',
         u'\u016b',
         u'',
         u'',
         u'',
         u'\u017e',
         u'BACKSPACE']
        keyList[0][1][13] = u''
        keyList[0][2][12] = u'\\'
        keyList[1][0] = [u'~',
         u'\u0104',
         u'\u010c',
         u'\u0118',
         u'\u0116',
         u'\u012e',
         u'\u0160',
         u'\u0172',
         u'\u016a',
         u'\u201e',
         u'\u201c',
         u'',
         u'\u017d',
         u'BACKSPACE']
        keyList[1][1][13] = u''
        keyList[1][2][12] = u'|'
        keyList.append([[u'\u02dc',
          u'\xbc',
          u'\xbd',
          u'\xbe',
          u'\xa4',
          u'\xa2',
          u'\xb0',
          u'\xa7',
          u'\xd7',
          u'\xab',
          u'\xbb',
          u'\xf7',
          u'\xb1',
          u'BACKSPACE'],
         [u'FIRST',
          u'1',
          u'2',
          u'3',
          u'4',
          u'5',
          u'6',
          u'7',
          u'8',
          u'9',
          u'0',
          u'-',
          u'=',
          u'\xad'],
         [u'LAST',
          u'!',
          u'@',
          u'#',
          u'$',
          u'%',
          u'^',
          u'&',
          u'*',
          u'(',
          u')',
          u'_',
          u'+',
          u'ENTER'],
         [u'SHIFT',
          u'',
          u'\xdf',
          u'\xa9',
          u'\xae',
          u'\u2122',
          u'\xac',
          u'\xa3',
          u'\u20ac',
          u'\xb7',
          u'\xb9',
          u'\xb2',
          u'\xb3',
          u'SHIFT'],
         [u'EXIT',
          u'LOC',
          u'LEFT',
          u'RIGHT',
          u'ALL',
          u'CLR',
          u'SPACE']])
        return keyList

    def norwegian(self, base):
        keyList = copy.deepcopy(base)
        keyList[0][0][0] = u'|'
        keyList[0][0][12] = u'\\'
        keyList[0][2][10] = u'\xf8'
        keyList[0][2][11] = u'\xe6'
        keyList[0][3][12] = u'\xb5'
        keyList[1][0][0] = u'\xa7'
        keyList[1][0][12] = u'@'
        keyList[1][2][10] = u'\xd8'
        keyList[1][2][11] = u'\xc6'
        keyList[1][3][12] = u''
        keyList[1][4].extend([u'\xa3', u'$', u'\u20ac'])
        return keyList

    def persian(self, base):
        keyList = copy.deepcopy(base)
        keyList.append([[u'\xf7',
          u'\u06f1',
          u'\u06f2',
          u'\u06f3',
          u'\u06f4',
          u'\u06f5',
          u'\u06f6',
          u'\u06f7',
          u'\u06f8',
          u'\u06f9',
          u'\u06f0',
          u'-',
          u'=',
          u'BACKSPACE'],
         [u'FIRST',
          u'\u0636',
          u'\u0635',
          u'\u062b',
          u'\u0642',
          u'\u0641',
          u'\u063a',
          u'\u0639',
          u'\u0647',
          u'\u062e',
          u'\u062d',
          u'\u062c',
          u'\u0686',
          u'\u067e'],
         [u'LAST',
          u'\u0634',
          u'\u0633',
          u'\u0649',
          u'\u0628',
          u'\u0644',
          u'\u0622',
          u'\u0627',
          u'\u062a',
          u'\u0646',
          u'\u0645',
          u'\u06a9',
          u'\u06af',
          u'ENTER'],
         [u'SHIFT',
          u'\u0638',
          u'\u0637',
          u'\u0698',
          u'\u0632',
          u'\u0631',
          u'\u0630',
          u'\u062f',
          u'\u0626',
          u'\u0621',
          u'\u0648',
          u'\u060c',
          u'\u061f',
          u'SHIFT'],
         [u'EXIT',
          u'LOC',
          u'LEFT',
          u'RIGHT',
          u'ALL',
          u'CLR',
          u'SPACE']])
        return keyList

    def polish(self, base):
        keyList = copy.deepcopy(base)
        keyList[0][3][11] = u'\u0105'
        keyList[0][3][12] = u'\u0107'
        keyList[0][-1].extend([u'\u0119',
         u'\u0142',
         u'\u0144',
         u'\xf3',
         u'\u015b',
         u'\u017a',
         u'\u017c'])
        keyList[1][2][12] = u'\u20ac'
        keyList[1][3][11] = u'\u0104'
        keyList[1][3][12] = u'\u0106'
        keyList[1][-1].extend([u'\u0118',
         u'\u0141',
         u'\u0143',
         u'\xd3',
         u'\u015a',
         u'\u0179',
         u'\u017b'])
        return keyList

    def swedish(self, base):
        keyList = copy.deepcopy(base)
        keyList[0][4].extend([u'\\', u'\xb5'])
        keyList[1][4].extend([u'\xa3', u'$', u'\u20ac'])
        return keyList

    def ukranian(self, base):
        keyList = copy.deepcopy(base)
        keyList[0][1][12] = u'\u0457'
        keyList[0][2][2] = u'\u0456'
        keyList[0][2][11] = u'\u0454'
        keyList[0][3][11] = u'\u0491'
        keyList[0][4].append(u'@')
        keyList[1][1][12] = u'\u0407'
        keyList[1][2][2] = u'\u0406'
        keyList[1][2][11] = u'\u0404'
        keyList[1][3][11] = u'\u0490'
        keyList[1][4].append(u'#')
        return keyList

    def unitedKingdom(self, base):
        keyList = copy.deepcopy(base)
        keyList[0][1][13] = u'\xa6'
        keyList[0][2][12] = u'#'
        keyList[0][3] = [u'SHIFT',
         u'\\',
         u'z',
         u'x',
         u'c',
         u'v',
         u'b',
         u'n',
         u'm',
         u',',
         u'.',
         u'/',
         u'',
         u'SHIFT']
        keyList[0][-1].extend([u'\xe1',
         u'\xe9',
         u'\xed',
         u'\xf3',
         u'\xfa'])
        keyList[1][0][0] = u'\xac'
        keyList[1][0][2] = u'"'
        keyList[1][0][3] = u'\xa3'
        keyList[1][1][13] = u'\u20ac'
        keyList[1][2][11] = u'@'
        keyList[1][2][12] = u'~'
        keyList[1][3] = [u'SHIFT',
         u'|',
         u'Z',
         u'X',
         u'C',
         u'V',
         u'B',
         u'N',
         u'M',
         u'<',
         u'>',
         u'?',
         u'',
         u'SHIFT']
        keyList[1][-1].extend([u'\xc1',
         u'\xc9',
         u'\xcd',
         u'\xd3',
         u'\xda'])
        return keyList

    def smsGotChar(self):
        if self.smsChar and self.selectAsciiKey(self.smsChar):
            self.okClicked()

    def setLocale(self):
        self.language, self.location, self.keyList = self.locales.get(self.lang, [None, None, None])
        if self.language is None or self.location is None or self.keyList is None:
            self.lang = 'en_EN'
            self.language = _('English')
            self.location = _('Various')
            self.keyList = self.english
        self.shiftLevel = 0
        self['locale'].setText(_('Locale') + ': ' + self.lang + '  (' + self.language + ' - ' + self.location + ')')

    def buildVirtualKeyBoard(self):
        self.shiftLevels = len(self.keyList)
        if self.shiftLevel >= self.shiftLevels:
            self.shiftLevel = 0
        self.keyboardWidth = len(self.keyList[self.shiftLevel][0])
        self.keyboardHeight = len(self.keyList[self.shiftLevel])
        self.maxKey = self.keyboardWidth * (self.keyboardHeight - 1) + len(self.keyList[self.shiftLevel][-1]) - 1
        self.list = []
        for keys in self.keyList[self.shiftLevel]:
            self.list.append(self.virtualKeyBoardEntryComponent(keys))

        self.previousSelectedKey = None
        if self.selectedKey is None:
            self.selectedKey = self.keyboardWidth
        self.markSelectedKey()

    def virtualKeyBoardEntryComponent(self, keys):
        res = [keys]
        text = []
        offset = 14 - self.keyboardWidth
        x = self.width * offset / 2
        if offset % 2:
            x += self.width / 2
        for key in keys:
            image = self.keyImages[self.shiftLevel].get(key, None)
            if image:
                width = image.size().width()
                res.append(MultiContentEntryPixmapAlphaBlend(pos=(x, 0), size=(width, self.height), png=image))
            else:
                width = self.width
                res.append(MultiContentEntryPixmapAlphaBlend(pos=(x, 0), size=(width, self.height), png=self.keyBackgrounds.get(key, self.key_bg)))
                if len(key) > 1:
                    text.append(MultiContentEntryText(pos=(x, 0), size=(width, self.height), font=1, flags=RT_HALIGN_CENTER | RT_VALIGN_CENTER, text=_(key.encode('utf-8')), color=self.shiftColors[self.shiftLevel]))
                else:
                    text.append(MultiContentEntryText(pos=(x, 0), size=(width, self.height), font=0, flags=RT_HALIGN_CENTER | RT_VALIGN_CENTER, text=key.encode('utf-8'), color=self.shiftColors[self.shiftLevel]))
            x += width

        return res + text

    def markSelectedKey(self):
        if self.previousSelectedKey is not None:
            self.list[self.previousSelectedKey / self.keyboardWidth] = self.list[self.previousSelectedKey / self.keyboardWidth][:-1]
        if self.selectedKey > self.maxKey:
            self.selectedKey = self.maxKey
        x = self.list[self.selectedKey / self.keyboardWidth][self.selectedKey % self.keyboardWidth + 1][1]
        if self.key_sel is None:
            width = self.width
        else:
            width = self.key_sel.size().width()
        self.list[self.selectedKey / self.keyboardWidth].append(MultiContentEntryPixmapAlphaBlend(pos=(x, 0), size=(width, self.height), png=self.key_sel))
        self.previousSelectedKey = self.selectedKey
        self['list'].setList(self.list)

    def okClicked(self):
        self.smsChar = None
        text = self.keyList[self.shiftLevel][self.selectedKey / self.keyboardWidth][self.selectedKey % self.keyboardWidth].encode('UTF-8')
        if text == u'':
            pass
        elif text == u'ALL':
            self['text'].markAll()
        elif text == u'BACK':
            self['text'].deleteBackward()
        elif text == u'BACKSPACE':
            self['text'].deleteBackward()
        elif text == u'BLANK':
            pass
        elif text == u'CLR':
            self['text'].deleteAllChars()
            self['text'].update()
        elif text == u'ENTER':
            self.save()
        elif text == u'ESC':
            self.cancel()
        elif text == u'EXIT':
            self.cancel()
        elif text == u'FIRST':
            self['text'].home()
        elif text == u'LOC':
            self.localeMenu()
        elif text == u'LAST':
            self['text'].end()
        elif text == u'LEFT':
            self['text'].left()
        elif text == u'OK':
            self.save()
        elif text == u'RIGHT':
            self['text'].right()
        elif text == u'SAVE':
            self.save()
        elif text == u'SHIFT':
            self.shiftClicked()
        elif text == u'Shift':
            self.shiftClicked()
        elif text == u'SPACE':
            self['text'].char(' '.encode('UTF-8'))
        else:
            self['text'].char(text.encode('UTF-8'))

    def cancel(self):
        self.close(None)

    def save(self):
        self.close(self['text'].getText())

    def localeMenu(self):
        languages = []
        from six import iteritems
        localesitems = self.locales.iteritems()
        for locale, data in localesitems:
            languages.append((data[0] + '  -  ' + data[1] + '  (' + locale + ')', locale))

        languages = sorted(languages)
        index = 0
        default = 0
        for item in languages:
            if item[1] == self.lang:
                default = index
                break
            index += 1

        self.session.openWithCallback(self.localeMenuCallback, ChoiceBox, _('Available locales are:'), list=languages, selection=default, keys=[])

    def localeMenuCallback(self, choice):
        if choice:
            self.lang = choice[1]
            self.setLocale()
            self.buildVirtualKeyBoard()

    def shiftClicked(self):
        self.smsChar = None
        self.shiftLevel = (self.shiftLevel + 1) % self.shiftLevels
        nextLevel = (self.shiftLevel + 1) % self.shiftLevels
        self['key_blue'].setText(self.shiftMsgs[nextLevel])
        self.buildVirtualKeyBoard()

    def keyToggleOW(self):
        self['text'].toggleOverwrite()
        self.overwrite = not self.overwrite
        if self.overwrite:
            self['mode'].setText(_('OVR'))
        else:
            self['mode'].setText(_('INS'))

    def backClicked(self):
        self['text'].deleteBackward()

    def forwardClicked(self):
        self['text'].deleteForward()

    def cursorFirst(self):
        self['text'].home()

    def cursorLast(self):
        self['text'].end()

    def up(self):
        self.smsChar = None
        self.selectedKey -= self.keyboardWidth
        if self.selectedKey < 0:
            self.selectedKey = self.maxKey / self.keyboardWidth * self.keyboardWidth + self.selectedKey % self.keyboardWidth
            if self.selectedKey > self.maxKey:
                self.selectedKey -= self.keyboardWidth
        self.markSelectedKey()

    def left(self):
        self.smsChar = None
        self.selectedKey = self.selectedKey / self.keyboardWidth * self.keyboardWidth + (self.selectedKey + self.keyboardWidth - 1) % self.keyboardWidth
        if self.selectedKey > self.maxKey:
            self.selectedKey = self.maxKey
        self.markSelectedKey()

    def right(self):
        self.smsChar = None
        self.selectedKey = self.selectedKey / self.keyboardWidth * self.keyboardWidth + (self.selectedKey + 1) % self.keyboardWidth
        if self.selectedKey > self.maxKey:
            self.selectedKey = self.selectedKey / self.keyboardWidth * self.keyboardWidth
        self.markSelectedKey()

    def down(self):
        self.smsChar = None
        self.selectedKey += self.keyboardWidth
        if self.selectedKey > self.maxKey:
            self.selectedKey %= self.keyboardWidth
        self.markSelectedKey()

    def keyNumberGlobal(self, number):
        self.smsChar = self.sms.getKey(number)
        self.selectAsciiKey(self.smsChar)

    def keyGotAscii(self):
        self.smsChar = None
        if self.selectAsciiKey(str(pyunichar(getPrevAsciiCode()).encode('utf-8'))):
            self.okClicked()

    def selectAsciiKey(self, char):
        if char == u' ':
            char = u'SPACE'
        self.shiftLevel = -1
        for keyList in self.keyList:
            self.shiftLevel = (self.shiftLevel + 1) % self.shiftLevels
            self.buildVirtualKeyBoard()
            selkey = 0
            for keys in keyList:
                for key in keys:
                    if key == char:
                        self.selectedKey = selkey
                        self.markSelectedKey()
                        return True
                    selkey += 1
